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

Azure Stream Analytics CSV, JSON ve Avro veri biçimlerindeki işleme olaylarını 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.

Not

Event Hub Capture tarafından oluşturulan AVRO dosyaları , özel seri durumdan çıkarıcı özelliğini kullanmanızı gerektiren belirli bir biçim kullanır. Daha fazla bilgi için bkz. .NET özel seri durumdan çıkarıcıları kullanarak herhangi bir biçimde girişi okuma.

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 örnekler, giriş olaylarını JSON biçiminde okuyan bir örnek algılayıcıyı gösterir. Tek bir olay örneği aşağıda verilmiştir:

{
    "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 kolayca erişmek için noktalı gösterimi (.) kullanın. Örneğin, bu sorgu önceki JSON verilerinde Location özelliğinin altında Enlem ve Boylam koordinatlarını seçer. Noktalı gösterim, aşağıda gösterildiği gibi birden çok düzeyde gezinmek için kullanılabilir.

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

Sonuç:

Deviceıd Lat Uzun Sıcaklık Sürüm
12345 47 122 80 1.2.45

Tüm özellikleri seçme

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

SELECT
    DeviceID,
    Location.*
FROM input

Sonuç:

Deviceıd Lat Uzun
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, özellik adlarını sabit kodlamadan dinamik sorgular oluşturmaya olanak tanır.

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

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

Buradaki amaç, makalenin üst kısmından bu başvuru verilerine örnek veri kümemizi birleştirmek ve her algılayıcı ölçüsü için eşiğinin üzerinde bir olay çıkarmaktır. Bu, birleştirme sayesinde birden çok algılayıcının ilgili eşiklerinin üzerinde olması durumunda yukarıdaki tek olayımızın birden çok çıkış olayı oluşturabileceği anlamına gelir. Birleştirme olmadan benzer sonuçlar elde etmek için aşağıdaki bölüme 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'te özelliği seçer ve bu ad başvuru verilerinden gelen özellik adıyla eşleşir. Ardından SensorReadings'ten ilişkili değer ayıklanır.

Sonuç:

Deviceıd SensorName AlertMessage
12345 Nem oranı Uyarı: Algılayıcı eşiğin üzerinde

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 verilerle, özellikleri farklı olaylara ayıklamak için aşağıdaki sorgu kullanılabilir.

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

Sonuç:

Deviceıd SensorName AlertMessage
12345 Sıcaklık 80
12345 Nem oranı 70
12345 CustomSensor01 5
12345 CustomSensor02 99
12345 SensorMetadata [object Object]

WITH kullanarak bu olayları farklı hedeflere yönlendirmek mümkündür:

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

Azure SQL Veritabanı'nı işinizde başvuru verileri olarak kullanırken, JSON biçiminde veri içeren bir sütuna sahip olmak mümkündür. Aşağıda bir örnek gösterilmiştir.

Deviceıd Veriler
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);
}

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

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. Dizi değerleriyle ilgili bazı tipik işlemler aşağıda ayrıntılı olarak verilmiştir. Bu örneklerde GetArrayElement, GetArrayElements, GetArrayLength ve APPLY işleci kullanılır.

Aşağıda bir olay örneği verilmiştir. Hem hem de CustomSensor03dizi türündedir:SensorMetadata

{
    "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 dizinde dizi öğesini seçin (ilk dizi öğesini seçme):

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 öğesini tek tek 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 Arrayındex 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 Üretici ABC
12345 Sürüm 1.2.45

Ayıklanan alanların sütunlarda görünmesi gerekiyorsa, JOIN işlemine ek olarak WITH söz dizimini kullanarak veri kümesini özetleyebilirsiniz. Bu birleşim, 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 Uzun smVersion smManufacturer
12345 47 122 1.2.45 ABC

Ayrıca Bkz.

Azure Stream Analytics'te Veri Türleri