Uraikan data JSON dan Avro di Azure Stream Analytics
Azure Stream Analytics mendukung pemrosesan kejadian dalam format data CSV, JSON, dan Avro. Data JSON dan Avro dapat disusun dan diisi beberapa jenis kompleks seperti objek berlapis (baris) dan array.
Catatan
File AVRO yang dibuat oleh Pengambilan Hub Kejadian menggunakan format tertentu yang mengharuskan Anda menggunakan fitur pendeserialisasi kustom. Untuk mengetahui informasi selengkapnya, lihat Membaca input dalam format apa pun menggunakan pendeserialisasi kustom .NET.
Merekam jenis data
Jenis data baris digunakan untuk mewakili array JSON dan Avro saat format terkait digunakan dalam aliran input. Contoh-contoh ini menunjukkan sensor sampel, yaitu membaca kejadian input dalam format JSON. Berikut adalah contoh satu peristiwa:
{
"DeviceId" : "12345",
"Location" :
{
"Lat": 47,
"Long": 122
},
"SensorReadings" :
{
"Temperature" : 80,
"Humidity" : 70,
"CustomSensor01" : 5,
"CustomSensor02" : 99,
"SensorMetadata" :
{
"Manufacturer":"ABC",
"Version":"1.2.45"
}
}
}
Mengakses bidang berlapis dalam skema yang diketahui
Gunakan notasi titik (.) untuk mengakses bidang berlapis dengan mudah secara langsung dari kueri Anda. Misalnya, kueri ini memilih koordinat Garis Lintang dan Bujur di bawah properti Lokasi dalam data JSON sebelumnya. Notasi titik dapat digunakan untuk menavigasi beberapa tingkat seperti yang ditunjukkan di bawah ini.
SELECT
DeviceID,
Location.Lat,
Location.Long,
SensorReadings.Temperature,
SensorReadings.SensorMetadata.Version
FROM input
Hasilnya adalah:
DeviceID | Lintang | Bujur | Suhu | Versi |
---|---|---|---|---|
12345 | 47 | 122 | 80 | 1.2.45 |
Pilih semua properti
Anda dapat memilih semua properti baris berlapis menggunakan kartubebas '*'. Pertimbangkan contoh berikut:
SELECT
DeviceID,
Location.*
FROM input
Hasilnya adalah:
DeviceID | Lintang | Bujur |
---|---|---|
12345 | 47 | 122 |
Mengakses bidang berlapis saat nama properti adalah variabel
Gunakan fungsi GetRecordPropertyValue jika nama properti adalah variabel. Fungsi memungkinkan untuk membangun kueri dinamis tanpa nama properti hardcoding.
Misalnya, bayangkan aliran sampel perlu digabungkan dengan data referensi berisi ambang untuk masing-masing sensor perangkat. Cuplikan data referensi tersebut ditunjukkan di bawah ini.
{
"DeviceId" : "12345",
"SensorName" : "Temperature",
"Value" : 85
},
{
"DeviceId" : "12345",
"SensorName" : "Humidity",
"Value" : 65
}
Tujuannya di sini adalah untuk menggabungkan himpunan data sampel kami dari bagian atas artikel ke data referensi tersebut, dan mengeluarkan satu kejadian untuk masing-masing ukuran sensor di atas ambang. Hal ini berarti kejadian tunggal kami di atas dapat menghasilkan beberapa kejadian output jika beberapa sensor berada di atas ambang masing-masing, berkat penggabungan. Untuk mencapai hasil serupa tanpa gabungan, lihat bagian di bawah ini.
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 memilih properti di SensorReadings, yang namanya cocok dengan nama properti yang berasal dari data referensi. Kemudian nilai terkait dari SensorReadings diekstrak.
Hasilnya adalah:
DeviceID | SensorName | AlertMessage |
---|---|---|
12345 | Kelembapan | Pemberitahuan : Sensor di atas ambang |
Mengonversi bidang baris menjadi kejadian terpisah
Untuk mengonversi bidang baris menjadi kejadian terpisah, gunakan operator APPLY bersama dengan fungsi GetRecordProperties.
Dengan data sampel asli, kueri berikut dapat digunakan untuk mengekstrak properti ke dalam kejadian yang berbeda.
SELECT
event.DeviceID,
sensorReading.PropertyName,
sensorReading.PropertyValue
FROM input as event
CROSS APPLY GetRecordProperties(event.SensorReadings) AS sensorReading
Hasilnya adalah:
DeviceID | SensorName | AlertMessage |
---|---|---|
12345 | Suhu | 80 |
12345 | Kelembapan | 70 |
12345 | CustomSensor01 | 5 |
12345 | CustomSensor02 | 99 |
12345 | SensorMetadata | [objek Objek] |
Menggunakan WITH, dimungkinkan untuk merutekan kejadian tersebut ke tujuan yang berbeda:
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'
Menguraikan baris JSON dalam data referensi SQL
Saat menggunakan Azure SQL Database sebagai data referensi dalam pekerjaan Anda, dimungkinkan untuk memiliki kolom yang memiliki data dalam format JSON. Contoh ditunjukkan di bawah ini.
DeviceID | Data |
---|---|
12345 | {"key": "value1"} |
54321 | {"key": "value2"} |
Anda dapat menguraikan baris JSON di kolom Data dengan menulis fungsi JavaScript sederhana yang ditentukan pengguna.
function parseJson(string) {
return JSON.parse(string);
}
Anda kemudian dapat membuat langkah dalam kueri Azure Stream Analytics seperti yang ditunjukkan di bawah ini untuk mengakses bidang rekaman JSON Anda.
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
Jenis data array
Jenis data array adalah kumpulan nilai yang diurutkan. Beberapa operasi umum pada nilai array dirinci di bawah ini. Contoh-contoh ini menggunakan fungsi GetArrayElement, GetArrayElements, GetArrayLength, dan operator APPLY.
Berikut adalah contoh peristiwa.
CustomSensor03
dan SensorMetadata
keduanya berjenis array:
{
"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"
}
]
}
Bekerja dengan elemen array tertentu
Pilih elemen array pada indeks yang ditentukan (memilih elemen array pertama):
SELECT
GetArrayElement(SensorReadings.CustomSensor03, 0) AS firstElement
FROM input
Hasilnya adalah:
firstElement |
---|
12 |
Pilih panjang array
SELECT
GetArrayLength(SensorReadings.CustomSensor03) AS arrayLength
FROM input
Hasilnya adalah:
arrayLength |
---|
3 |
Mengonversi elemen array menjadi kejadian terpisah
Memilih semua elemen array sebagai kejadian individual. Operator APPLY bersama dengan fungsi bawaan GetArrayElements mengekstrak semua elemen array sebagai kejadian individual:
SELECT
DeviceId,
CustomSensor03Record.ArrayIndex,
CustomSensor03Record.ArrayValue
FROM input
CROSS APPLY GetArrayElements(SensorReadings.CustomSensor03) AS CustomSensor03Record
Hasilnya adalah:
DeviceId | ArrayIndex | 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
Hasilnya adalah:
DeviceId | smKey | smValue |
---|---|---|
12345 | Produsen | ABC |
12345 | Versi | 1.2.45 |
Jika bidang yang diekstrak perlu muncul dalam kolom, dimungkinkan untuk memicu himpunan data menggunakan sintaks WITH selain operasi JOIN. Gabungan tersebut memerlukan kondisi batas waktu yang mencegah duplikasi:
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
Hasilnya adalah:
DeviceId | Lintang | Bujur | smVersion | smManufacturer |
---|---|---|---|---|
12345 | 47 | 122 | 1.2.45 | ABC |