GetArrayElement (Azure 流分析)

返回指定索引处的数组元素。 此函数可用于分析 JSON 和 AVRO 格式输入事件数据中的数组和嵌套对象。 有关更多示例,请参阅 分析 JSON 和 AVRO 数据。 如果需要返回数组中的所有嵌套元素,请改用 GetArrayElements

语法

GetArrayElement ( array_expression, bigint_expression )  

参数

array_expression

要作为源数组计算的数组表达式。 array_expression可以是 Array 类型的列,也可以是另一个函数调用的结果。

bigint_expression

要计算为数组索引的 bigint 表达式。 元素数组中的序号位置,从 0 开始。

返回类型

返回类型由数组元素类型确定,可以是任何 受支持的类型。

示例

示例数据

[
{
    "DeviceId" : "123",
    "SensorReadings" :
    {
        "Temperature" : 80,
        "Humidity" : 70,
        "CustomSensor": [1,1,0]
    }
},
{
    "DeviceId" : "631",
    "SensorReadings" :
    {
        "Temperature" : 81,
        "Humidity" : 69,
        "CustomSensor": [0,1,0]
    }
}
]

上面的示例数据集是包含两条记录的数组。 在 JSON 文件中用作 本地输入 时,Azure 流分析会解释顶级数组以生成行/事件。 无需在查询语法中考虑它。

在单个记录级别,有两个 具有不同类型的属性。 DeviceId 的类型为 nvarchar (max) SensorReadings 属于 类型 record (object) 。 必要时,GetType 可用于确定类型。

SensorReadings有三个属性:两个是 bigint 类型: TemperatureHumidityCustomSensor属于 bigint) 的数组类型 (。 如果此数组更为复杂 (本身包含记录或) 数组,则可使用 GetArrayElements (复数) 和 GetRecordPropertyValue 的组合。

查询

此查询返回记录根处的字段 (DeviceId) 、使用 点表示法 (Temperature的嵌套字段、Humidity) ,包括 数组 (CustomSensor) ,最后通过 GetArrayElement (索引 0 和 1) 返回该数组的第一个和第二个元素:

SELECT   
    i.DeviceId,
    i.SensorReadings.Temperature,
    i.SensorReadings.Humidity,
    i.SensorReadings.CustomSensor as CustomSensorArray,
    GetArrayElement(i.SensorReadings.CustomSensor,0) AS FirstCustomSensorValue,
    GetArrayElement(i.SensorReadings.CustomSensor,1) AS SecondCustomSensorValue
FROM input i

返回以下输出:

DeviceId 温度 湿度 CustomSensorArray FirstCustomSensorValue SecondCustomSensorValue
631 81 69 0,1,0 0 1
123 80 70 1,1,0 1 1

使用 CROSS APPLY 展开数组:

SELECT   
    i.DeviceId,
    CustomerSensorValue.ArrayValue AS CustomerSensorValue
FROM input AS i
CROSS APPLY GetArrayElements(i.SensorReadings.CustomSensor) AS CustomerSensorValue

返回以下输出:

DeviceId CustomerSensorValue
631 0
631 1
631 0
123 0
123 1
123 1

如有必要,可以在此处轻松聚合内容:

SELECT   
    i.DeviceId,
    SUM(CustomerSensorValue.ArrayValue) AS CustomerSensorTotal 
FROM input AS i
CROSS APPLY GetArrayElements(i.SensorReadings.CustomSensor) AS CustomerSensorValue 
GROUP BY i.DeviceId, TumblingWindow(minute, 1)
DeviceId CustomerSensorTotal
123 2
631 1

另请参阅