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

Lihat juga

Jenis Data di Azure Stream Analytics