Azure Stream Analytics JSON ve Avro verilerini ayrıştırma

Azure Stream Analytics hizmeti CSV, JSON ve Avro veri biçimlerinde olayları işlemeyi destekler. Hem JSON hem de Avro verileri yapılandırılabilir ve iç içe nesneler (kayıtlar) ve diziler gibi bazı karmaşık türleri içerebilir.

Veri türlerini kaydetme

Kayıt veri türleri, giriş veri akışlarında karşılık gelen biçimler kullanıldığında JSON ve Avro dizilerini temsil etmek için kullanılır. Bu örneklerde giriş olaylarını JSON biçiminde okuyan bir örnek algılayıcı gösterilmektedir. Tek bir olay örneği aşağıda verilmişti:

{
    "DeviceId" : "12345",
    "Location" :
    {
        "Lat": 47,
        "Long": 122
    },
    "SensorReadings" :
    {
        "Temperature" : 80,
        "Humidity" : 70,
        "CustomSensor01" : 5,
        "CustomSensor02" : 99,
        "SensorMetadata" : 
        {
        "Manufacturer":"ABC",
        "Version":"1.2.45"
        }
    }
}

Bilinen şemada iç içe yerleştirilmiş alanlara erişme

İç içe yerleştirilmiş alanlara doğrudan sorgunuzdan erişmek için noktalı gösterimi (.) kullanın. Örneğin, bu sorgu önceki JSON verilerinde Location özelliğinin altındaki Enlem ve Boylam koordinatlarını seçer. Aşağıdaki kod parçacığında gösterildiği gibi birden çok düzeyde gezinmek için nokta gösterimini kullanın:

SELECT
    DeviceID,
    Location.Lat,
    Location.Long,
    SensorReadings.Temperature,
    SensorReadings.SensorMetadata.Version
FROM input

Sonuç:

|DeviceID|Lat|Long|Temperature|Version|
|-|-|-|-|-|
|12345|47|122|80|1.2.45|

Tüm özellikleri seçme

Joker karakteri kullanarak * iç içe bir kaydın tüm özelliklerini seçebilirsiniz. Aşağıdaki örneği inceleyin:

SELECT
    DeviceID,
    Location.*
FROM input

Sonuç:

|DeviceID|Lat|Long|
|-|-|-|
|12345|47|122|

Özellik adı bir değişken olduğunda iç içe yerleştirilmiş alanlara erişme

Özellik adı bir değişkense GetRecordPropertyValue işlevini kullanın. Bu işlev, özellik adlarını sabit kodlamadan dinamik sorgular oluşturmanıza yardımcı olur.

Örneğin, örnek veri akışının her cihaz algılayıcısı için eşikler içeren başvuru verileriyle birleştirilmesi gerektiğini düşünün. Bu tür başvuru verilerinin bir parçacığı aşağıdaki örnekte gösterilmiştir.

{
    "DeviceId" : "12345",
    "SensorName" : "Temperature",
    "Value" : 85
},
{
    "DeviceId" : "12345",
    "SensorName" : "Humidity",
    "Value" : 65
}

Amaç, makalenin başlangıcındaki örnek veri kümesini referans verilerine birleştirmek ve eşik değerini aşan her sensör ölçümü için bir olay üretmektir. Bu birleşim, birden çok algılayıcı kendi eşiklerinin üzerindeyse tek olayın birden çok çıkış olayı oluşturabileceği anlamına gelir. Birleştirme olmadan benzer sonuçlar elde etmek için aşağıdaki örneğe bakın:

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, SensorReadings içinde, başvuru verilerinden gelen özellik adıyla eşleşen özelliği seçer. Ardından SensorReadings'ten ilişkili değeri ayıklar.

Sonuç:

|DeviceID|SensorName|AlertMessage|
| - | - | - |
| 12345 | Humidity | Alert: Sensor above threshold |

Kayıt alanlarını ayrı olaylara dönüştürme

Kayıt alanlarını ayrı olaylara dönüştürmek için APPLY işlecini GetRecordProperties işleviyle birlikte kullanın.

Özgün örnek verileri kullanarak, özellikleri farklı olaylara ayıklamak için aşağıdaki sorguyu kullanabilirsiniz:

SELECT
    event.DeviceID,
    sensorReading.PropertyName,
    sensorReading.PropertyValue
FROM input as event
CROSS APPLY GetRecordProperties(event.SensorReadings) AS sensorReading

Sonuç:

|DeviceID|SensorName|AlertMessage|
|-|-|-|
|12345|Temperature|80|
|12345|Humidity|70|
|12345|CustomSensor01|5|
|12345|CustomSensor02|99|
|12345|SensorMetadata|[object Object]|

WITH kullanarak bu olayları farklı hedeflere yönlendirebilirsiniz:

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'

SQL başvuru verilerinde JSON kaydını ayrıştırma

İşinizde başvuru verileri olarak Azure SQL Database kullandığınızda, JSON biçiminde veri içeren bir sütun ekleyebilirsiniz. Aşağıdaki örnekte bu biçim gösterilmektedir:

|DeviceID|Data|
|-|-|
|12345|{"key": "value1"}|
|54321|{"key": "value2"}|

Basit bir JavaScript kullanıcı tanımlı işlevi yazarak Veri sütunundaki JSON kaydını ayrıştırabilirsiniz.

function parseJson(string) {
return JSON.parse(string);
}

JSON kayıtlarınızın alanlarına erişmek için, aşağıdaki örnekte gösterildiği gibi Stream Analytics sorgunuzda bir adım oluşturun.

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

Dizi veri türleri

Dizi veri türleri sıralı bir değer koleksiyonudur. Bu bölümde dizi değerleriyle ilgili bazı tipik işlemler ayrıntılı olarak açıklanmıştır. Bu örneklerde GetArrayElement, GetArrayElements, GetArrayLength ve APPLY işleci işlevleri kullanılır.

Burada bir olay örneği verilmiş. Hem CustomSensor03 hem de SensorMetadatadizi türündedir.

{
    "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"
        }
    ]
}

Belirli bir dizi öğesiyle çalışma

Belirtilen bir dizindeki dizi öğesini seçin (ilk dizi öğesini seçin):

SELECT
    GetArrayElement(SensorReadings.CustomSensor03, 0) AS firstElement
FROM input

Sonuç:

|firstElement|
|-|
|12|

Dizi uzunluğunu seçin

SELECT
    GetArrayLength(SensorReadings.CustomSensor03) AS arrayLength
FROM input

Sonuç:

|arrayLength|
|-|
|3|

Dizi öğelerini ayrı olaylara dönüştürme

Tüm dizi öğelerini ayrı ayrı olaylar olarak seçin. APPLY işleci getArrayElements yerleşik işleviyle birlikte tüm dizi öğelerini tek tek olaylar olarak ayıklar:

SELECT
    DeviceId,
	CustomSensor03Record.ArrayIndex,
	CustomSensor03Record.ArrayValue
FROM input
CROSS APPLY GetArrayElements(SensorReadings.CustomSensor03) AS CustomSensor03Record

Sonuç:

|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

Sonuç:

|DeviceId|smKey|smValue|
|-|-|-|
|12345|Manufacturer|ABC|
|12345|Version|1.2.45|

Veri kümesini ayıklanan alanları sütunlarda görüntülemek için JOIN işlemiyle birlikte WITH söz dizimini kullanarak çevirebilirsiniz. Bu birleştirme, yinelemeyi engelleyen bir zaman sınırı koşulu gerektirir:

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

Sonuç:

|DeviceId|Lat|Long|smVersion|smManufacturer|
|-|-|-|-|-|
|12345|47|122|1.2.45|ABC|

Azure Stream Analytics'teki Veri Türleri