Azure 流分析查询:将 json 数组数据发送到 PowerBI

Azure Stream Analytics Query: Send json array data to PowerBI

我正在尝试通过流分析将我的 IoT 中心数据发送到 Power BI。 只要 IoT 设备的 json 数据中不包含任何数组,此方法就可以正常工作。

我的问题是: 我必须如何修改我的流分析查询,以便 PowerBI 能够将数据解释为 array/table?如何按每个数组元素进行时间戳(使用 "timecreated")?

我发送到 IoT 中心的 json 字符串如下所示:

{"sensordata":[{"name":"Temp_0","value":3,"timecreated":"2016-11-09T11:08:00Z"},
{"name":"Temp_0","value":7,"timecreated":"2016-11-09T11:08:02Z"},
{"name":"Temp_1","value":2,"timecreated":"2016-11-09T11:08:04Z"}]}

流分析从 IoT 中心接收的内容:

[{"sensordata":[{"name":"Temp_0","value":3,"timecreated":"2016-11-09T11:08:00.0000000Z"},
{"name":"Temp_0","value":7,"timecreated":"2016-11-09T11:08:02.0000000Z"},
{"name":"Temp_1","value":2,"timecreated":"2016-11-09T11:08:04.0000000Z"}],    
"EventProcessedUtcTime":"2016-11-09T10:08:57.9325156Z","PartitionId":0,
 "EventEnqueuedUtcTime":"2016-11-09T10:08:47.8050000Z","IoTHub":
{"MessageId":null,"CorrelationId":null,"ConnectionDeviceId":"toCloudDevice",
"ConnectionDeviceGenerationId":"607350268321425367",
"EnqueuedTime":"0001-01-01T00:00:00.0000000","StreamId":null}}]

我的流分析查询如下所示:

SELECT sensordata.ArrayValue AS data,
  COUNT(*)
INTO
  [transmit-data]
FROM
  [receive-data] AS e
CROSS APPLY GetArrayElements(e.sensordata) AS sensordata
GROUP BY
  sensordata,
  tumblingWindow(Second, 10)

IoT 中心向 Power BI 发送的内容:

[{"data":{"name":"Temp_1","value":2,"timecreated":"2016-11-09T11:08:04.0000000Z"},
"count":1},{"data":{"name":"Temp_0","value":7,"timecreated":"2016-11-09T11:08:02.0000000Z"},
"count":1},{"data":{"name":"Temp_0","value":3,"timecreated":"2016-11-09T11:08:00.0000000Z"},
"count":1}]

PowerBI 无法以合理的方式解释此数据。

我希望能够生成图表,例如在 x 轴上显示时间,在 y 轴上显示 Temp_0 的值。

关于这个问题有什么想法吗?非常感谢您的帮助。

(顺便说一句:来自 IoT 设备的 json 字符串具有不同数量的数组元素!)

Power BI 不允许像数组或记录这样的复杂对象。您遇到的问题是 "data" 字段是一条记录。

请改为尝试以下查询:

SELECT 
    sensordata.ArrayValue.data.Name,
    sensordata.ArrayValue.data.Value,
    sensordata.ArrayValue.data.Timecreated,
    COUNT(*)
INTO
  [transmit-data]
FROM
  [receive-data] AS e
CROSS APPLY GetArrayElements(e.sensordata) AS sensordata
GROUP BY
  sensordata,
  tumblingWindow(Second, 10)

不幸的是,今天您不能对单个数组元素应用 TIMESTAMP BY。单个事件只能有一个时间戳是有限制的。但是,您可以将您的工作分成两部分,其中第一份工作执行 CROSS APPLY 并将事件插入中间事件中心,第二份工作执行 TIMESTAMP BY 和聚合