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 CustomSensor03
dizi 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 |