如何在Stream Analytics查询中提取和展平JSON数组以及为'TIMESTAMP BY'指定数组值

时间:2019-06-03 03:59:26

标签: azure azure-stream-analytics

我将以下输入流数据输入到Stream Analytics。

[
    {
        "timestamp": 1559529369274,
        "values": [
            {
                "id": "SimCh01.Device01.Ramp1",
                "v": 39,
                "q": 1,
                "t": 1559529359833
            },
            {
                "id": "SimCh01.Device01.Ramp2",
                "v": 183.5,
                "q": 1,
                "t": 1559529359833
            }
        ],
        "EventProcessedUtcTime": "2019-06-03T02:37:29.5824231Z",
        "PartitionId": 3,
        "EventEnqueuedUtcTime": "2019-06-03T02:37:29.4390000Z",
        "IoTHub": {
            "MessageId": null,
            "CorrelationId": null,
            "ConnectionDeviceId": "ew-IoT-01-KepServer",
            "ConnectionDeviceGenerationId": "636948080712635859",
            "EnqueuedTime": "2019-06-03T02:37:29.4260000Z",
            "StreamId": null
        }
    }
]

我尝试提取“ values”数组,并在TIMESTAMP BY中的数组元素中指定“ t”

我能够在Stream Analytics中使用简单的SAQL语句进行查询,以读取输入并路由到输出。但是,我只对上面的“ values”数组感兴趣。

这是我的第一次尝试。当我尝试重新启动Stream Analytics Job时,它不喜欢我的“ TIMESTAMP BY”语句

SELECT
    KepValues.ArrayValue.id,
    KepValues.ArrayValue.v,
    KepValues.ArrayValue.q,
    KepValues.ArrayValue.t
INTO
    [PowerBI-DS]
FROM
   [IoTHub-Input] as event
    CROSS APPLY GetArrayElements(event.[values]) as KepValues
    TIMESTAMP BY KepValues.ArrayValue.t 

================================================ ============================== 这是我的第二次尝试。它仍然不喜欢我的“ TIMESTAMP BY”语句。

With [PowerBI-Modified-DS] As (
    SELECT
        KepValues.ArrayValue.id as ID,
        KepValues.ArrayValue.v as V,
        KepValues.ArrayValue.q as Q,
        KepValues.ArrayValue.t as T
    FROM
       [IoTHub-Input] as event
       CROSS APPLY GetArrayElements(event.[values]) as KepValues
)
SELECT
    ID, V, Q, T
INTO
    [PowerBI-DS]
FROM 
    [PowerBI-Modified-DS] TIMESTAMP BY T 

提取后,这就是我所期望的,具有“ id”,“ v”,“ q”,“ t”列的表,每行将具有单个ArrayElement。例如,

"SimCh01.Device01.Ramp1", 39, 1, 1559529359833
"SimCh01.Device01.Ramp2", 183.5, 1, 1559529359833

已添加

从那时起,我将查询修改如下,以通过将Unix时间t转换为DateTime时间来创建DateTime

With [PowerBI-Modified-DS] As (
SELECT
        arrayElement.ArrayValue.id as ID,
        arrayElement.ArrayValue.v as V,
        arrayElement.ArrayValue.q as Q,
        arrayElement.ArrayValue.t as TT
FROM
       [IoTHub-Input] as iothubAlias
       CROSS APPLY GetArrayElements(iothubAlias.data) as arrayElement 
)      
SELECT
    ID, V, Q, DATEADD(millisecond, TT, '1970-01-01T00:00:00Z')  as T
INTO
    [SAJ-01-PowerBI]
FROM 
    [PowerBI-Modified-DS] 

我设法添加DATEADD()将Unix Time转换为DateTime并将其称为T。现在如何添加'TIMESTAMP BY'。我确实尝试在[PowerBI-Modified-DS]之后添加。但是编辑器抱怨插入无效。我还可以做些什么。或这是我能做的最好的。我了解我需要设置“ TIMESTAMP BY”,因此Power BI了解这是流数据。

1 个答案:

答案 0 :(得分:0)

TIMESTAMP BY clause in Stream Analytics的值必须为DATETIME类型。支持符合ISO 8601格式的字符串值。在您的示例中,“ t”的值不符合该标准。

要在这种情况下使用TIMESTAMP BY子句,您必须先对数据进行预处理,然后再将其发送到Stream Analytics或更改源以使用此格式创建事件(特别是字段“ t”)。

在执行查询之前,Stream Analytics分配TIMESTAMP。因此,TIMESTAMP BY表达式只能引用输入有效负载中的字段。您有2个选择。

  1. 您可以拥有2个ASA职位。首先执行CROSS APPLY,第二项执行TIMESTAMP BY。
  2. 您可以在C#(sign up for preview access)中实现反序列化器。这样,您就可以拥有一项使用您的实现读取传入事件的作业。解串器会将Unix时间转换为DateTime,然后可以在TIMESTAMP BY子句中使用此字段。