从 Azure 流分析中的数组中提取某些值,然后手动添加其他值
Extract certain values from Arrays in Azure Stream Analytics and then adding other values manually
我已经设置了一些传感器,我通过事件中心接收数据 (JSON) 到流分析作业并向下到数据湖 Gen2。我只需要数据中的一些值并想添加一些值,例如楼层、房间,因为这些数据不包含在我从传感器收到的数据中。由于它没有那么多传感器,我想我可以在流分析中手动添加它。例如。当 serialno 等于“1234567”时,添加楼层“2”。
在这里我 运行 遇到了一些麻烦,因为数据存储在数组中,如下所示。
我的目标是将数组中的元素(数据点)分开以分离事件,但仍然将传感器的值保留为 SerialNo、DateTime 并添加值作为 floor、room 等。
不知道这个能不能执行?
这是我接收到流分析的数据示例。在此示例中,它只有两个数据点,但也有多达九个数据点的情况。原因是传感器测量许多不同的东西(例如温度、湿度)并在 1 小时和 24 小时内将它们自己的聚合作为平均值。
[
{
"dsType": "MIBUS",
"timeStamp": 1583304733314,
"dateTime": "2020-03-04T06:52:13.0000000Z",
"serialNo": "1234567",
"manufacturer": "Trank",
"battLvl": 0,
"bridgeId": "03000000",
"dpCnt": 2,
"datapoint": [
{
"type": "FLOAT",
"name": "Temperature",
"size": 32,
"dataType": "BCD_DIGIT",
"res": 0.1,
"resUnit": "Degrees",
"valueType": "CSV",
"unit": "C",
"value": 12.5,
"scale": 1,
"min": "-20",
"max": "55",
"low": " ",
"high": " "
},
{
"type": "NUMBER",
"name": "Humidity",
"size": 8,
"dataType": "UINT8",
"unit": "%",
"res": 1,
"resUnit": "%",
"valueType": "CSV",
"value": 46,
"scale": 1,
"min": " ",
"max": " ",
"low": " ",
"high": " "
}
],
"uniqueId": "TR1234567",
"EventProcessedUtcTime": "2020-03-04T07:50:07.7614906Z",
"PartitionId": 0,
"EventEnqueuedUtcTime": "2020-03-04T06:52:13.3990000Z"
},
所以我希望从上面显示的数据中得到的结果看起来有点像这样:
SerialNo DateTime name value valueType Floor Room
1234567 2020-03-04T06:52:13.0000000Z Temperature 12,5 CSV 2 Bedroom
1234567 2020-03-04T06:52:13.0000000Z Humidity 46 CSV 2 Bedroom
我已经尝试过函数 ass GetArrayElement、CROSS APPLY、GetRecordProperties 等,但都没有成功。可能是因为我没有以正确的方式应用它们。
我愿意接受每一个正确的建议:)
提前致谢!
您可以通过编写如下查询轻松转换 array elements into separate events:
SELECT i.serialNo, i.dateTime, sensorData.ArrayValue.name,
sensorData.ArrayValue.value, sensorData.ArrayValue.valueType
FROM input i
CROSS APPLY GetArrayElements(datapoint) as sensorData
为了获取楼层和卧室的值,您还可以使用Reference data input (SQL database or blob storage). And then JOIN此参考数据和您的实时输入来获取基于序列号的楼层和卧室的值。
我已经设置了一些传感器,我通过事件中心接收数据 (JSON) 到流分析作业并向下到数据湖 Gen2。我只需要数据中的一些值并想添加一些值,例如楼层、房间,因为这些数据不包含在我从传感器收到的数据中。由于它没有那么多传感器,我想我可以在流分析中手动添加它。例如。当 serialno 等于“1234567”时,添加楼层“2”。 在这里我 运行 遇到了一些麻烦,因为数据存储在数组中,如下所示。
我的目标是将数组中的元素(数据点)分开以分离事件,但仍然将传感器的值保留为 SerialNo、DateTime 并添加值作为 floor、room 等。 不知道这个能不能执行?
这是我接收到流分析的数据示例。在此示例中,它只有两个数据点,但也有多达九个数据点的情况。原因是传感器测量许多不同的东西(例如温度、湿度)并在 1 小时和 24 小时内将它们自己的聚合作为平均值。
[
{
"dsType": "MIBUS",
"timeStamp": 1583304733314,
"dateTime": "2020-03-04T06:52:13.0000000Z",
"serialNo": "1234567",
"manufacturer": "Trank",
"battLvl": 0,
"bridgeId": "03000000",
"dpCnt": 2,
"datapoint": [
{
"type": "FLOAT",
"name": "Temperature",
"size": 32,
"dataType": "BCD_DIGIT",
"res": 0.1,
"resUnit": "Degrees",
"valueType": "CSV",
"unit": "C",
"value": 12.5,
"scale": 1,
"min": "-20",
"max": "55",
"low": " ",
"high": " "
},
{
"type": "NUMBER",
"name": "Humidity",
"size": 8,
"dataType": "UINT8",
"unit": "%",
"res": 1,
"resUnit": "%",
"valueType": "CSV",
"value": 46,
"scale": 1,
"min": " ",
"max": " ",
"low": " ",
"high": " "
}
],
"uniqueId": "TR1234567",
"EventProcessedUtcTime": "2020-03-04T07:50:07.7614906Z",
"PartitionId": 0,
"EventEnqueuedUtcTime": "2020-03-04T06:52:13.3990000Z"
},
所以我希望从上面显示的数据中得到的结果看起来有点像这样:
SerialNo DateTime name value valueType Floor Room
1234567 2020-03-04T06:52:13.0000000Z Temperature 12,5 CSV 2 Bedroom
1234567 2020-03-04T06:52:13.0000000Z Humidity 46 CSV 2 Bedroom
我已经尝试过函数 ass GetArrayElement、CROSS APPLY、GetRecordProperties 等,但都没有成功。可能是因为我没有以正确的方式应用它们。
我愿意接受每一个正确的建议:)
提前致谢!
您可以通过编写如下查询轻松转换 array elements into separate events:
SELECT i.serialNo, i.dateTime, sensorData.ArrayValue.name,
sensorData.ArrayValue.value, sensorData.ArrayValue.valueType
FROM input i
CROSS APPLY GetArrayElements(datapoint) as sensorData
为了获取楼层和卧室的值,您还可以使用Reference data input (SQL database or blob storage). And then JOIN此参考数据和您的实时输入来获取基于序列号的楼层和卧室的值。