JSON-en Avro-gegevens parseren in Azure Stream Analytics
Azure Stream Analytics ondersteuning voor het verwerken van gebeurtenissen in CSV-, JSON-en Avro-gegevens indelingen. JSON-en Avro-gegevens kunnen worden gestructureerd en bevatten complexe typen, zoals geneste objecten (records) en matrices.
Notitie
AVRO-bestanden die zijn gemaakt door Event hub Capture, gebruiken een specifieke indeling waarvoor u de functie voor aangepaste deserialisatie moet gebruiken. Zie invoer lezen in elke indeling met behulp van aangepaste .net-deserialisatievoor meer informatie.
Stream Analytics AVRO-deserialisatie biedt geen ondersteuning voor het toewijzings type. Stream Analytics kan geen EventHub Capture-blobs lezen, omdat EventHub Capture gebruikmaakt van de toewijzing.
Record gegevens typen
Record gegevens typen worden gebruikt voor het weer geven van JSON-en Avro-matrices wanneer overeenkomende indelingen worden gebruikt in de gegevens stromen voor invoer. In deze voor beelden ziet u een voor beeld van een sensor, waarmee invoer gebeurtenissen in JSON-indeling worden gelezen. Hier volgt een voor beeld van één gebeurtenis:
{
"DeviceId" : "12345",
"Location" :
{
"Lat": 47,
"Long": 122
},
"SensorReadings" :
{
"Temperature" : 80,
"Humidity" : 70,
"CustomSensor01" : 5,
"CustomSensor02" : 99,
"SensorMetadata" :
{
"Manufacturer":"ABC",
"Version":"1.2.45"
}
}
}
Toegang krijgen tot geneste velden in een bekend schema
Gebruik punt notatie (.) om eenvoudig toegang te krijgen tot geneste velden rechtstreeks vanuit uw query. Met deze query worden bijvoorbeeld de breedte-en lengte coördinaten geselecteerd onder de locatie-eigenschap in de voor gaande JSON-gegevens. De punt notatie kan worden gebruikt om te navigeren op meerdere niveaus, zoals hieronder wordt weer gegeven.
SELECT
DeviceID,
Location.Lat,
Location.Long,
SensorReadings.Temperature,
SensorReadings.SensorMetadata.Version
FROM input
Het resultaat is:
| DeviceID | Lat | Omvang | Temperatuur | Versie |
|---|---|---|---|---|
| 12345 | 47 | 122 | 80 | 1.2.45 |
Alle eigenschappen selecteren
U kunt alle eigenschappen van een geneste record selecteren met behulp van het Joker teken ' * '. Kijk eens naar het volgende voorbeeld:
SELECT
DeviceID,
Location.*
FROM input
Het resultaat is:
| DeviceID | Lat | Omvang |
|---|---|---|
| 12345 | 47 | 122 |
Toegang krijgen tot geneste velden als eigenschaps naam een variabele is
Gebruik de functie GetRecordPropertyValue als de naam van de eigenschap een variabele is. Zo kunt u dynamische query's maken zonder hardcoding-eigenschaps namen.
Stel bijvoorbeeld dat de gegevens stroom van de steek proef moet worden gekoppeld met referentie gegevens die drempels voor elke sensor van het apparaat bevatten. Hieronder ziet u een fragment van dergelijke referentie gegevens.
{
"DeviceId" : "12345",
"SensorName" : "Temperature",
"Value" : 85
},
{
"DeviceId" : "12345",
"SensorName" : "Humidity",
"Value" : 65
}
Het doel is hier om de gegevensset van de voor beelden boven aan het artikel te koppelen aan die referentie gegevens en om één gebeurtenis uit te voeren voor elke sensor meting boven de drempel waarde. Dit betekent dat met onze bovenstaande gebeurtenis meer uitvoer gebeurtenissen kunnen worden gegenereerd als meerdere Sens oren boven hun respectieve drempel waarden vallen, dankzij de samen voeging. Zie de sectie hieronder om Vergelijk bare resultaten te krijgen zonder een koppeling te maken.
SELECT
input.DeviceID,
thresholds.SensorName,
"Alert : Sensor above threshold" AS AlertMessage
FROM input -- stream input
JOIN thresholds -- reference data input
ON
input.DeviceId = thresholds.DeviceId
WHERE
GetRecordPropertyValue(input.SensorReadings, thresholds.SensorName) > thresholds.Value
GetRecordPropertyValue selecteert de eigenschap in SensorReadings, die overeenkomt met de naam van de eigenschap die afkomstig is van de referentie gegevens. Vervolgens wordt de gekoppelde waarde uit SensorReadings geëxtraheerd.
Het resultaat is:
| DeviceID | Sensornaam | AlertMessage |
|---|---|---|
| 12345 | Vochtigheid | Waarschuwing: sensor boven drempel waarde |
Record velden omzetten in afzonderlijke gebeurtenissen
Als u record velden wilt omzetten in afzonderlijke gebeurtenissen, gebruikt u de operator Apply samen met de functie GetRecordProperties .
Met de oorspronkelijke voorbeeld gegevens kan de volgende query worden gebruikt voor het uitpakken van eigenschappen in verschillende gebeurtenissen.
SELECT
event.DeviceID,
sensorReading.PropertyName,
sensorReading.PropertyValue
FROM input as event
CROSS APPLY GetRecordProperties(event.SensorReadings) AS sensorReading
Het resultaat is:
| DeviceID | Sensornaam | AlertMessage |
|---|---|---|
| 12345 | Temperatuur | 80 |
| 12345 | Vochtigheid | 70 |
| 12345 | CustomSensor01 | 5 |
| 12345 | CustomSensor02 | 99 |
| 12345 | SensorMetadata | [object object] |
Met withkunt u deze gebeurtenissen vervolgens naar verschillende bestemmingen routeren:
WITH Stage0 AS
(
SELECT
event.DeviceID,
sensorReading.PropertyName,
sensorReading.PropertyValue
FROM input as event
CROSS APPLY GetRecordProperties(event.SensorReadings) AS sensorReading
)
SELECT DeviceID, PropertyValue AS Temperature INTO TemperatureOutput FROM Stage0 WHERE PropertyName = 'Temperature'
SELECT DeviceID, PropertyValue AS Humidity INTO HumidityOutput FROM Stage0 WHERE PropertyName = 'Humidity'
JSON-record parseren in SQL-referentie gegevens
Wanneer u Azure SQL Database als referentie gegevens in uw taak gebruikt, is het mogelijk om een kolom met gegevens in JSON-indeling te hebben. Hieronder kunt u een voorbeeld bekijken.
| DeviceID | Gegevens |
|---|---|
| 12345 | {"sleutel": "waarde1"} |
| 54321 | {"sleutel": "Value2"} |
U kunt de JSON-record in de gegevens kolom parseren door een door de gebruiker gedefinieerde Java script-functie te schrijven.
function parseJson(string) {
return JSON.parse(string);
}
U kunt vervolgens een stap in uw Stream Analytics query maken, zoals hieronder wordt weer gegeven om toegang te krijgen tot de velden van uw JSON-records.
WITH parseJson as
(
SELECT DeviceID, udf.parseJson(sqlRefInput.Data) as metadata,
FROM sqlRefInput
)
SELECT metadata.key
INTO output
FROM streamInput
JOIN parseJson
ON streamInput.DeviceID = parseJson.DeviceID
Matrix gegevens typen
Matrix gegevens typen zijn een geordende verzameling waarden. Enkele typische bewerkingen op matrix waarden worden hieronder beschreven. In deze voor beelden worden de functies GetArrayElement, GetArrayElements, GetArrayLengthen de operator Apply gebruikt.
Hier volgt een voor beeld van één gebeurtenis. Beide CustomSensor03 en SensorMetadata zijn van het type matrix:
{
"DeviceId" : "12345",
"SensorReadings" :
{
"Temperature" : 80,
"Humidity" : 70,
"CustomSensor01" : 5,
"CustomSensor02" : 99,
"CustomSensor03": [12,-5,0]
},
"SensorMetadata":[
{
"smKey":"Manufacturer",
"smValue":"ABC"
},
{
"smKey":"Version",
"smValue":"1.2.45"
}
]
}
Werken met een specifiek matrix element
Selecteer een matrix element bij een opgegeven index (selecteren van het eerste matrix element):
SELECT
GetArrayElement(SensorReadings.CustomSensor03, 0) AS firstElement
FROM input
Het resultaat is:
| firstElement |
|---|
| 12 |
Matrix lengte selecteren
SELECT
GetArrayLength(SensorReadings.CustomSensor03) AS arrayLength
FROM input
Het resultaat is:
| arrayLength |
|---|
| 3 |
Matrix elementen omzetten in afzonderlijke gebeurtenissen
Selecteer alle matrix elementen als afzonderlijke gebeurtenissen. De operator apply in combi natie met de ingebouwde functie GetArrayElements haalt alle matrix elementen op als afzonderlijke gebeurtenissen:
SELECT
DeviceId,
CustomSensor03Record.ArrayIndex,
CustomSensor03Record.ArrayValue
FROM input
CROSS APPLY GetArrayElements(SensorReadings.CustomSensor03) AS CustomSensor03Record
Het resultaat is:
| DeviceId | Array index | ArrayValue |
|---|---|---|
| 12345 | 0 | 12 |
| 12345 | 1 | 5 |
| 12345 | 2 | 0 |
SELECT
i.DeviceId,
SensorMetadataRecords.ArrayValue.smKey as smKey,
SensorMetadataRecords.ArrayValue.smValue as smValue
FROM input i
CROSS APPLY GetArrayElements(SensorMetadata) AS SensorMetadataRecords
Het resultaat is:
| DeviceId | smKey | smValue |
|---|---|---|
| 12345 | Fabrikant | ABC |
| 12345 | Versie | 1.2.45 |
Als de geëxtraheerde velden in kolommen moeten worden weer gegeven, is het mogelijk om de gegevensset te draaien met de syntaxis with naast de bewerking samen voegen . Voor deze samen voeging is een tijds grens vereist die duplicatie voor komt:
WITH DynamicCTE AS (
SELECT
i.DeviceId,
SensorMetadataRecords.ArrayValue.smKey as smKey,
SensorMetadataRecords.ArrayValue.smValue as smValue
FROM input i
CROSS APPLY GetArrayElements(SensorMetadata) AS SensorMetadataRecords
)
SELECT
i.DeviceId,
i.Location.*,
V.smValue AS 'smVersion',
M.smValue AS 'smManufacturer'
FROM input i
LEFT JOIN DynamicCTE V ON V.smKey = 'Version' and V.DeviceId = i.DeviceId AND DATEDIFF(minute,i,V) BETWEEN 0 AND 0
LEFT JOIN DynamicCTE M ON M.smKey = 'Manufacturer' and M.DeviceId = i.DeviceId AND DATEDIFF(minute,i,M) BETWEEN 0 AND 0
Het resultaat is:
| DeviceId | Lat | Omvang | smVersion | smManufacturer |
|---|---|---|---|---|
| 12345 | 47 | 122 | 1.2.45 | ABC |