【问题标题】:Azure Stream Analytics Query: Send json array data to PowerBIAzure 流分析查询:将 json 数组数据发送到 PowerBI
【发布时间】:2017-03-23 04:35:12
【问题描述】:

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

我的问题是:我必须如何修改我的流分析查询,以便 PowerBI 能够将数据解释为数组/表?如何对每个数组元素进行 TIMESTAMP(使用“timecreated”)?

我发送到 IoT Hub 的 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 Hub 发送到 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 字符串具有不同数量的数组元素!)

【问题讨论】:

    标签: powerbi azure-stream-analytics azure-iot-hub


    【解决方案1】:

    Power BI 不允许复杂的对象,如数组或记录。您的问题是“数据”字段是一条记录。

    请尝试以下查询:

    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 和聚合

    【讨论】:

    • 这非常有用,谢谢! (不过,我不得不在 SELECT 语句中省略“.data”。)PowerBI 现在能够消化数据并生成图表。我还不能将“Temp_0”和“Temp_1”分开,并将尝试按照您的想法使用中间事件中心。
    • (在 PowerBI 服务图中分离“Temp_0”和“Temp_1”的一种简单方法是对“名称”使用过滤器。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2018-11-03
    • 2021-11-22
    相关资源
    最近更新 更多