0

我在从 Azure IOT Hub 到 Azure 流分析 (ASA) 到 Power BI 的事件中提取数据时遇到问题。

下面是进入 Azure IOT Hub 的源示例:

"data": "[{\"Temperature\":74.15750885,\"Humidity\":26.32574463}]",
"device_id": "1e0037000d47353136383631",
"event": "Photon_WeatherData",
"published_at": "2017-12-12T16:52:18.405Z"

我可以通过 ASA 直接查询将其推送到 Power BI:

SELECT *
INTO PowerBI
FROM PhotonEventData

结果是: PBI 数据集的屏幕截图

[{"Temperature":73.81002045,"Humidity":26.56988525}]

但我似乎无法剥离 ASA 中的数据点,以便将每个键/值对传递给 Power BI。我尝试了一些不同的方法,例如:

SELECT data.Temperature
INTO PowerBI
FROM PhotonEventData
4

2 回答 2

0

似乎“数据”字段被格式化为字符串而不是 JSON 对象。您可能希望使用 JavaScript UDF 函数将其解析为 JSON。为此,您可以在 Azure 流分析中创建此函数:

function main(input, key) {
   //  return key
    var myinput = String(input)
    myinput = myinput.substring(1, myinput.length - 1);
    values = JSON.parse(myinput);
    return values[key]
 }

那么您的查询将是:

select udf.extract(data,'Temperature') as temp, udf.extract(data,'Humidity') as hmdt from PhotonEventData

如果您有任何进一步的问题,请告诉我。

于 2017-12-13T02:12:45.517 回答
0

由于 data 是一个数组而不是一个复杂的类型SELECT data.Temperate将不起作用。

您需要我们的GetArrayElement方法,请参阅文档。由于数组包含复杂类型,因此您需要GetRecordPropertyValue来获取Temperature属性的值:

SELECT GetRecordPropertyValue(GetArrayElement(data, 0), 'Temperature') AS Temperature
INTO PowerBI
FROM PhotonEventData

编辑:正如另一个答案指出的那样,您的 data 属性包含一个字符串数组,而不是一个 json 对象数组。如果你能解决这个问题,让它正确地代表一个像下面这样的对象,你可以使用我的解决方案:

{
    "data": [{ "Temperature":74.15750885, "Humidity":26.32574463}],
    "device_id": "1e0037000d47353136383631",
    "event": "Photon_WeatherData",
    "published_at": "2017-12-12T16:52:18.405Z"
}
于 2017-12-12T19:06:59.750 回答