通过流分析将带有数组的流传递给 SQL 中的多行

Posted

技术标签:

【中文标题】通过流分析将带有数组的流传递给 SQL 中的多行【英文标题】:pass stream with array to multiple rows in SQL by Stream Analytics 【发布时间】:2018-04-06 13:11:53 【问题描述】:

我有来自IoT Hub 的流,例如:


    "topic": "saveData",
    "deviceId": "testDevice",
    "data": [
        
            "timestamp": "2018-04-06T11:46:11.842305",
            "device": "baiTest",
            "variable": "Status01_Test",
            "name": "m_01_test",
            "value": 365
        ,
        
            "timestamp": "2018-04-06T11:46:11.842306",
            "device": "hmuTest",
            "variable": "Status02_Test",
            "name": "m_02_test",
            "value": 817
        ,
        
            "timestamp": "2018-04-06T11:46:11.842307",
            "device": "vwzTest",
            "variable": "Status03_Test",
            "name": "m_03_test",
            "value": 247
        
    ]

我想像这样在SQL DB 中传递这个流:

deviceId    timestamp                   device   variable       name       value
testDevice  2018-04-06T11:46:11.842305  baiTest  Status01_Test  m_01_test  365
testDevice  2018-04-06T11:46:11.842306  hmuTest  Status02_Test  m_02_test  817
testDevice  2018-04-06T11:46:11.842307  vwzTest  Status03_Test  m_03_test  247

到目前为止我的代码是:

WITH itemList AS ( 
    SELECT deviceId, GetArrayElement(data,0) as datas
    FROM [iotHub] WHERE topic = 'saveData' )
SELECT deviceId, datas.timestamp, datas.device, datas.variable, datas.name, datas.value
INTO [sqlTable]
FROM itemList

但这只会将data.array 的第一个索引[0] 存储到SQL 中。 我认为可以使用**GetArrayElements** 函数处理存储数组,但我无法管理它。

【问题讨论】:

【参考方案1】:

您应该使用 GetArrayElements 在 Azure 流分析中展平复杂的 json。请参考以下查询。

SELECT   
  iothubAlias.deviceId,
  arrayElement.ArrayValue.timestamp,
  arrayElement.ArrayValue.device,
  arrayElement.ArrayValue.variable,
  arrayElement.ArrayValue.name,
  arrayElement.ArrayValue.value
FROM [iothub-input] as iothubAlias  
CROSS APPLY GetArrayElements(iothubAlias.data) AS arrayElement  

你会得到你想要的结果。

【讨论】:

以上是关于通过流分析将带有数组的流传递给 SQL 中的多行的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:分析器中的 character filter 介绍

通过 .NET 远程处理将流传递给方法

如何将 Azure 流分析中的“类字典”结构转换为带有 javascript UDF 的多维数组?

使用循环将信息流传递给setter时出现运行时错误

我可以将数据集作为参数传递给流分析作业中的 AzureML 实验吗?

如何从具有多行的 SQL 查询中获取非字符串数组字段