إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تدعم خدمة Azure Stream Analytics معالجة الأحداث بصيغ بيانات CSV وJSON وAvro. يمكن هيكلة بيانات JSON وAvro وتحتوي على بعض الأنواع المعقدة مثل الكائنات (السجلات) والمصفوفات المتداخلة.
أنواع بيانات السجل
تُستخدم أنواع بيانات السجل لتمثيل مصفوفات JSON وAvro عند استخدام التنسيقات المقابلة في تدفقات بيانات الإدخال. توضح هذه الأمثلة مستشعر عينة، والذي يقرأ أحداث الإدخال بتنسيق JSON. فيما يلي مثال لحدث واحد:
{
"DeviceId" : "12345",
"Location" :
{
"Lat": 47,
"Long": 122
},
"SensorReadings" :
{
"Temperature" : 80,
"Humidity" : 70,
"CustomSensor01" : 5,
"CustomSensor02" : 99,
"SensorMetadata" :
{
"Manufacturer":"ABC",
"Version":"1.2.45"
}
}
}
الوصول إلى الحقول المتداخلة في المخطط المعروف
استخدم تدوين النقاط (.) للوصول إلى الحقول المتداخلة مباشرة من استفسارك. على سبيل المثال، يحدد هذا الاستعلام إحداثيات خطوط الطول والعرض ضمن خاصية الموقع في بيانات JSON السابقة. استخدم تدوين النقاط للتنقل في عدة مستويات كما هو موضح في المقطع التالي:
SELECT
DeviceID,
Location.Lat,
Location.Long,
SensorReadings.Temperature,
SensorReadings.SensorMetadata.Version
FROM input
النتيجة هي:
|DeviceID|Lat|Long|Temperature|Version|
|-|-|-|-|-|
|12345|47|122|80|1.2.45|
حدد جميع الخصائص
يمكنك اختيار جميع خصائص السجل المتداخل باستخدام البطاقة * البرية. تأمل المثال التالي:
SELECT
DeviceID,
Location.*
FROM input
النتيجة هي:
|DeviceID|Lat|Long|
|-|-|-|
|12345|47|122|
الوصول إلى الحقول المتداخلة عندما يكون اسم الخاصية متغيرًا
استخدم دالة GetRecordPropertyValue إذا كان اسم الخاصية متغيرا. تساعدك هذه الوظيفة على بناء استعلامات ديناميكية دون ترميز أسماء الخصائص بشكل ثابت.
على سبيل المثال، تخيل أن تدفق بيانات العينة يحتاج إلى ربطه ببيانات مرجعية تحتوي على عتبات لكل جهاز استشعار. يتم عرض قصاصة برمجية من هذه البيانات المرجعية في القصاصة البرمجية التالية.
{
"DeviceId" : "12345",
"SensorName" : "Temperature",
"Value" : 85
},
{
"DeviceId" : "12345",
"SensorName" : "Humidity",
"Value" : 65
}
الهدف هو ربط مجموعة بيانات العينة من أعلى المقالة بتلك البيانات المرجعية، وإخراج حدث واحد لكل مقياس حساس فوق عتبه. هذا الارتباط يعني أن الحدث الواحد يمكنه توليد عدة أحداث إخراج إذا كانت عدة حساسات فوق عتبات كل منه. لتحقيق نتائج مماثلة دون الانضمام، راجع المثال التالي:
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 التي تطابق اسم الخاصية القادم من بيانات المرجع. ثم يستخرج القيمة المرتبطة من قراءات الاستشعار.
النتيجة هي:
|DeviceID|SensorName|AlertMessage|
| - | - | - |
| 12345 | Humidity | Alert: Sensor above threshold |
تحويل حقول التسجيل إلى أحداث منفصلة
لتحويل حقول السجل إلى أحداث منفصلة، استخدم عامل APPLY مع دالة GetRecordProperties .
باستخدام بيانات العينة الأصلية، يمكنك استخدام الاستعلام التالي لاستخراج الخصائص إلى أحداث مختلفة:
SELECT
event.DeviceID,
sensorReading.PropertyName,
sensorReading.PropertyValue
FROM input as event
CROSS APPLY GetRecordProperties(event.SensorReadings) AS sensorReading
النتيجة هي:
|DeviceID|SensorName|AlertMessage|
|-|-|-|
|12345|Temperature|80|
|12345|Humidity|70|
|12345|CustomSensor01|5|
|12345|CustomSensor02|99|
|12345|SensorMetadata|[object Object]|
باستخدام WITH، يمكنك توجيه تلك الأحداث إلى وجهات مختلفة:
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'
تحليل سجل JSON في بيانات مرجع SQL
عندما تستخدم Azure SQL Database كبيانات مرجعية في عملك، يمكنك تضمين عمود يحتوي على بيانات بصيغة JSON. المثال التالي يوضح هذا التنسيق:
|DeviceID|Data|
|-|-|
|12345|{"key": "value1"}|
|54321|{"key": "value2"}|
يمكنك تحليل سجل JSON في عمود البيانات بكتابة دالة بسيطة يحددها المستخدم.
function parseJson(string) {
return JSON.parse(string);
}
للوصول إلى حقول سجلات JSON الخاصة بك، أنشئ خطوة في استعلام تحليلات التدفق كما هو موضح في المثال التالي.
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
أنواع بيانات المصفوفة
أنواع بيانات المصفوفة هي مجموعة مرتبة من القيم. هذا القسم يوضح بعض العمليات النموذجية على قيم المصفوفة. تستخدم هذه الأمثلة الدوال GetArrayElement، GetArrayElements، GetArrayLength، وعامل APPLY .
فيما يلي مثال على حدث. كلا من CustomSensor03 و 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"
}
]
}
العمل مع عنصر مصفوفة محدد
اختر عنصر المصفوفة عند مؤشر محدد (اختر العنصر الأول للمصفوفة):
SELECT
GetArrayElement(SensorReadings.CustomSensor03, 0) AS firstElement
FROM input
النتيجة هي:
|firstElement|
|-|
|12|
تحديد طول المصفوفة
SELECT
GetArrayLength(SensorReadings.CustomSensor03) AS arrayLength
FROM input
النتيجة هي:
|arrayLength|
|-|
|3|
تحويل عناصر المصفوفة إلى أحداث منفصلة
اختر جميع عناصر المصفوفة كأحداث فردية. يقوم عامل APPLY مع دالة GetArrayElements المدمجة باستخراج جميع عناصر المصفوفة كأحداث فردية:
SELECT
DeviceId,
CustomSensor03Record.ArrayIndex,
CustomSensor03Record.ArrayValue
FROM input
CROSS APPLY GetArrayElements(SensorReadings.CustomSensor03) AS CustomSensor03Record
النتيجة هي:
|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
النتيجة هي:
|DeviceId|smKey|smValue|
|-|-|-|
|12345|Manufacturer|ABC|
|12345|Version|1.2.45|
لعرض الحقول المستخرجة في الأعمدة، قم بتدوير مجموعة البيانات باستخدام صياغة WITH مع عملية JOIN . يتطلب هذا الانضمام شرطا لحدود زمنية يمنع التكرار:
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
النتيجة هي:
|DeviceId|Lat|Long|smVersion|smManufacturer|
|-|-|-|-|-|
|12345|47|122|1.2.45|ABC|