sou (08thse) のはてなブログ

今のところ Azure まわりの情報発信が主体です

Azure IoT Central から Azure Data Explorer へ入れ子な JSON をエクスポートする際の考慮

Azure IoT Central で PoC を実施させていただいていたのですが。その際に踏んだ事象でございます。

下記の記事などを参考にすると、デバイスからは入れ子になった JSON でデータが送られてきます。

qiita.com

送られてくる JSON のイメージは下記の通り。

{
  "applicationId":"xxxxx",
  "component":"SensorAltitude",
  "deviceId":"cl0evatmso",
  "enqueuedTime":"2023-11-30T02:42:14.515Z",
  "enrichments":{"workingSet":"hogehoge"},
  "messageProperties":{"iothub-creation-time-utc":"2023-11-30T02:42:14.442Z"},
  "messageSource":"telemetry",
  "module":null,
  "schema":"default@v1",
  "telemetry": {
    "SensorAltitude":38.88142843434689,
  },
  "templateId":"dtmi:Espressif:o88xsnugnyr"
}


そして、Azure IoT Central には Azure Data Explorer (ADX) へエクスポートする機能があるのですが…

どうしても、ADX 側へエクスポートする際に JSON入れ子になっていると、その属性を ADX 側のテーブルへマッピングしてくれない様子。

そのため、エクスポート時の書き換えルールで入れ子にならないように指定する必要がありました。

import "iotc" as iotc;
{
    schema: "default@v1",
    applicationId: .applicationId,
    deviceId: .device.id,
    templateId: .device.templateId,
    messageSource: .messageSource,
    enqueuedTime: .enqueuedTime,
    SensorMagnetX: .telemetry | iotc::find(.name == "SensorMagnetX").value,
    SensorMagnetY: .telemetry | iotc::find(.name == "SensorMagnetY").value,
    SensorMagnetZ: .telemetry | iotc::find(.name == "SensorMagnetZ").value,
    ... <送付される可能性のある属性の分、すべて記載する> ..,
    messageProperties: .messageProperties,
    enrichments: .enrichments,
    component: .component,
    module: .module
}


IoT Central では実現できない分析などを行いたいときは ADX を活用したりすると思います。
もし、同じポイントに当たった方は参考にしていただければ幸いです。