GetArrayElement (Analisi di flusso di Azure)
Restituisce l'elemento matrice in corrispondenza dell'indice specificato. Questa funzione è utile per l'analisi di matrici e oggetti annidati nei dati degli eventi di input in formato JSON e AVRO. Per altri esempi, vedere Analisi dei dati JSON e AVRO. Se è necessario restituire tutti gli elementi annidati in una matrice, usare invece GetArrayElements .
Sintassi
GetArrayElement ( array_expression, bigint_expression )
Argomenti
array_expression
Espressione di matrice da valutare come matrice di origine. array_expression può essere una colonna di tipo Array o il risultato di un'altra chiamata di funzione.
bigint_expression
Espressione bigint da valutare come indice di matrice. Posizione ordinale nella matrice di elementi, a partire da 0.
Tipi restituiti
Il tipo restituito è determinato dal tipo di elemento della matrice e può essere uno dei tipi supportati.
Esempio
Dati di esempio
[
{
"DeviceId" : "123",
"SensorReadings" :
{
"Temperature" : 80,
"Humidity" : 70,
"CustomSensor": [1,1,0]
}
},
{
"DeviceId" : "631",
"SensorReadings" :
{
"Temperature" : 81,
"Humidity" : 69,
"CustomSensor": [0,1,0]
}
}
]
Il set di dati di esempio precedente è una matrice di due record. Se usato come input locale in un file JSON, la matrice di primo livello viene interpretata per la generazione di righe/eventi da Analisi di flusso di Azure. Non è necessario prenderlo in considerazione nella sintassi della query.
A livello di singolo record, esistono due proprietà con tipi diversi.
DeviceId
è di tipo nvarchar(max), SensorReadings
è di tipo record (oggetto).
GetType può essere usato per determinare il tipo quando necessario.
SensorReadings
ha tre proprietà: due sono di tipo bigint: Temperature
e Humidity
e CustomSensor
è di tipo matrice (di bigint). Se questa matrice era più complessa (se stessa contenente record o matrici), è possibile usare una combinazione di GetArrayElements (plural) e GetRecordPropertyValue .
Query
Questa query restituisce i campi nella radice del record (DeviceId
), i campi annidati usando la notazione punto (Temperature
,Humidity
), inclusa una matrice (CustomSensor
) e infine il primo e il secondo elemento della matrice tramite GetArrayElement (indice 0 e 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
Restituisce l'output seguente:
DeviceId | Temperatura | Umidità | CustomSensorArray | FirstCustomSensorValue | SecondCustomSensorValue |
---|---|---|---|---|---|
631 | 81 | 69 | 0,1,0 | 0 | 1 |
123 | 80 | 70 | 1,1,0 | 1 | 1 |
Usare CROSS APPLY per espandere la matrice:
SELECT
i.DeviceId,
CustomerSensorValue.ArrayValue AS CustomerSensorValue
FROM input AS i
CROSS APPLY GetArrayElements(i.SensorReadings.CustomSensor) AS CustomerSensorValue
Restituisce l'output seguente:
DeviceId | CustomerSensorValue |
---|---|
631 | 0 |
631 | 1 |
631 | 0 |
123 | 0 |
123 | 1 |
123 | 1 |
Da qui è possibile aggregare facilmente il contenuto, se necessario:
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 |