Azure Stream Analytics JSON ve avro verilerini ayrıştırın
CSV, JSON ve avro veri biçimlerinde olayları işlemeyi destekler Azure Stream Analytics. Hem JSON hem de avro verileri yapılandırılabilir ve iç içe geçmiş nesneler (kayıtlar) ve diziler gibi bazı karmaşık türleri içerebilir.
Not
AVRO Olay Hub 'ı tarafından oluşturulan dosyalar özel seri hale getirici özelliğini kullanmanızı gerektiren belirli bir biçimi kullanır. Daha fazla bilgi için bkz. .NET özel seri hale getiriciler kullanarak herhangi bir biçimde giriş okuma.
Stream Analytics AVRO serisini kaldırma, eşleme türünü desteklemez. EventHub yakalama eşlemesi kullandığından, Stream Analytics EventHub yakalama bloblarını okuyamıyorum.
Veri türlerini Kaydet
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 örnek bir algılayıcı gösterilmektedir. 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 geçmiş alanlara erişin
Doğrudan Sorgunuzla iç içe geçmiş alanlara kolayca erişmek için nokta gösterimini (.) kullanın. Örneğin, bu sorgu önceki JSON verilerinde Location özelliği altındaki Enlem ve boylam koordinatlarını seçer. Nokta gösterimi 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ç:
| DeviceID | [ | Kalacağını | Sıcaklık | Sürüm |
|---|---|---|---|---|
| 12345 | 47 | 122 | 80 | 1.2.45 |
Tüm Özellikleri Seç
' * ' Joker karakterini kullanarak iç içe geçmiş bir kaydın tüm özelliklerini seçebilirsiniz. Aşağıdaki örneği inceleyin:
SELECT
DeviceID,
Location.*
FROM input
Sonuç:
| DeviceID | [ | Kalacağını |
|---|---|---|
| 12345 | 47 | 122 |
Özellik adı bir değişken olduğunda iç içe alanlara erişin
Özellik adı bir değişken ise Getrecordpropertyvalue işlevini kullanın. Bu özellik adlarını kodlamadan dinamik sorgular oluşturulmasına olanak sağlar.
Örneğin, örnek veri akışının her bir cihaz algılayıcısı için eşikler içeren başvuru verileriyle katılması gerektiğini düşünün. Bu tür başvuru verilerinin bir parçacığı aşağıda gösterilmiştir.
{
"DeviceId" : "12345",
"SensorName" : "Temperature",
"Value" : 85
},
{
"DeviceId" : "12345",
"SensorName" : "Humidity",
"Value" : 65
}
Buradaki amaç, makalenin en üstündeki örnek veri kümenizi, bu başvuru verilerine katmaktır ve her bir algılayıcı ölçüsü için eşiğin üstünde bir olay çıktı. Diğer bir deyişle, yukarıdaki tek olayımız, ilgili eşiklerinin üzerinde birden fazla algılayıcı varsa, bu, birleşimde teşekkürler. JOIN olmadan benzer sonuçlara ulaşmak 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 , Sensorreadusing içindeki özelliği seçer. Bu ad, başvuru verilerinden gelen özellik adı ile eşleşir. Ardından Sensorreadlılar 'dan ilişkili değer ayıklanır.
Sonuç:
| DeviceID | SensorName | AlertMessage |
|---|---|---|
| 12345 | Nem oranı | Uyarı: Yukarıdaki algılayıcı eşiğin üstünde |
Kayıt alanlarını ayrı olaylara Dönüştür
Kayıt alanlarını ayrı olaylara dönüştürmek için, Getrecordproperties Işleviyle birlikte Apply işlecini kullanın.
Özgün örnek verilerle, aşağıdaki sorgu, özellikleri farklı olaylara ayıklamak için kullanılabilir.
SELECT
event.DeviceID,
sensorReading.PropertyName,
sensorReading.PropertyValue
FROM input as event
CROSS APPLY GetRecordProperties(event.SensorReadings) AS sensorReading
Sonuç:
| DeviceID | SensorName | AlertMessage |
|---|---|---|
| 12345 | Sıcaklık | 80 |
| 12345 | Nem oranı | 70 |
| 12345 | CustomSensor01 | 5 |
| 12345 | CustomSensor02 | 99 |
| 12345 | SensorMetadata | [nesne nesnesi] |
İlekullanarak, bu olayları farklı hedeflere yönlendirmek mümkün olur:
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şinizdeki başvuru verileri olarak kullanırken JSON biçiminde veri içeren bir sütun olması mümkündür. Aşağıda bir örnek gösterilmiştir.
| DeviceID | Veriler |
|---|---|
| 12345 | {"Key": "değer1"} |
| 54321 | {"Key": "değer2"} |
Basit bir JavaScript Kullanıcı tanımlı işlevi yazarak veri sütununda 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ı değerler koleksiyonudur. Dizi değerlerinde bazı tipik işlemler aşağıda ayrıntılı olarak verilmiştir. Bu örnekler, GetArrayElement, getarrayelements, GetArrayLengthve Apply işleci işlevlerini kullanır.
Tek bir olaya bir örnek aşağıda verilmiştir. Her ikisi de CustomSensor03 SensorMetadata dizi 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 dizinde dizi öğesi seçin (ilk dizi öğesini seçerek):
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ür
Tek tek olaylar olarak tüm dizi öğelerini seçin. Getarrayelements yerleşik işlevi Ile birlikte Apply işleci, tüm dizi öğelerini ayrı 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 | Ü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özdizimi kullanılarak veri kümesini Özet hale getirmeniz mümkündür. Bu birleşimin, çoğaltmayı önleyen bir zaman sınırı koşulu gerekir:
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 | [ | Kalacağını | smVersion | smManufacturer |
|---|---|---|---|---|
| 12345 | 47 | 122 | 1.2.45 | ABC |