GetArrayElement (Azure Stream Analytics)
指定したインデックス位置にある配列要素を返します。 この関数は、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]
}
}
]
上記のサンプル データセットは、2 つのレコードの配列です。 JSON ファイルで ローカル入力 として使用する場合、最上位の配列は、Azure Stream Analytics による行/イベントの生成に対して解釈されます。 クエリ構文で考慮する必要はありません。
個々のレコード レベルには、型が異なる 2 つのプロパティ があります。
DeviceId
は nvarchar(max)型で、 SensorReadings
は record 型 (object) です。
GetType を使用して、必要に応じて型を決定できます。
SensorReadings
には 3 つのプロパティがあります。2 つは bigintTemperature
型で、 Humidity
CustomSensor
は型配列 (bigint) です。 この配列がより複雑な場合 (それ自体にレコードまたは配列を含む)、 GetArrayElements (plural) と GetRecordPropertyValue の組み合わせを使用できます。
クエリ
このクエリは、レコード (DeviceId
) のルートにあるフィールド、ドット表記 (,Humidity
) を使用して入れ子になったフィールド ()、配列 (CustomSensor
Temperature
)、最後に GetArrayElement (インデックス 0 と 1) を介してその配列の最初と 2 番目の要素を返します。
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 |