أنماط الاستعلام الشائعة في Azure Stream Analytics وFabric Eventstream

ملحوظة

تم بناء Fabric Eventstream على نفس وقت التشغيل الذي يبنى فيه Azure Stream Analytics. لذلك، المفاهيم الموضحة في هذا المقال تنطبق على كل من Azure Stream Analytics وFabric Eventstream.

يتم التعبير عن الاستعلامات في Azure Stream Analytics بلغة استعلام شبيهة ب SQL. تم توثيق بنى اللغة في دليل مرجعي لغة استعلام تحليلات التدفق .

يمكن لتصميم الاستعلام التعبير عن منطق تمرير بسيط لنقل بيانات الأحداث من تدفق إدخال واحد إلى مخزن بيانات الإخراج، أو يمكنه إجراء مطابقة أنماط غنية وتحليل زمني لحساب التجمعات عبر فترات زمنية مختلفة كما في حل بناء إنترنت الأشياء باستخدام دليل تحليلات التدفق . يمكنك ربط البيانات من عدة مدخلات لدمج أحداث البث، ويمكنك إجراء عمليات بحث مقابل بيانات مرجعية ثابتة لإثراء قيم الأحداث. يمكنك أيضا كتابة البيانات إلى عدة مخرجات.

توضح هذه المقالة حلولا لعدة أنماط استعلام شائعة بناء على سيناريوهات واقعية.

صيغ البيانات المدعومة

يدعم Azure Stream Analytics معالجة الأحداث بصيغ بيانات CSV وJSON وAvro. يمكن أن تحتوي صيغ JSON و Avro على أنواع معقدة مثل الكائنات المتداخلة (السجلات) أو المصفوفات. لمزيد من المعلومات حول العمل مع هذه الأنواع المعقدة من البيانات، راجع تحليل بيانات JSON و AVRO.

إرسال البيانات إلى عدة مخرجات

يمكن استخدام عدة عبارات SELECT لإخراج البيانات إلى مصارف إخراج مختلفة. على سبيل المثال، يمكن لعبارة SELECT إخراج تنبيه قائم على العتبة بينما يمكن لأخرى إخراج الأحداث إلى مخزن كتلة.

ضع في اعتبارك المدخلات التالية:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

وتريد أن يكون الناتج التالي من الاستعلام:

الأرشيفات المخرجة:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

تنبيه مخرجات:

| Make | Time | Count |
| --- | --- | --- |
| Make2 |2023-01-01T00:00:10.0000000Z |3 |

استعلام باستخدام جملتين SELECT مع مخرجات Archive وإخراج Alert:

SELECT
	*
INTO
	ArchiveOutput
FROM
	Input TIMESTAMP BY Time

SELECT
	Make,
	System.TimeStamp() AS Time,
	COUNT(*) AS [Count]
INTO
	AlertOutput
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)
HAVING
	[Count] >= 3

يخبر بند INTO خدمة تحليلات التدفق بأي من المخرجات يجب أن تكتب البيانات إليها. يعرف أول SELECT استعلام تمرير يستقبل البيانات من المدخل ويرسلها إلى المخرجات المسماة ArchiveOutput. يقوم الاستعلام الثاني بتجميع وتصفية البيانات قبل إرسال النتائج إلى مخرج نظام تنبيه لاحق يسمى AlertOutput.

يمكن استخدام جملة WITH لتعريف عدة كتل استعلام فرعي. هذا الخيار له ميزة فتح عدد أقل من القراء لمصدر الإدخال.

الاستعلام:

WITH ReaderQuery AS (
	SELECT
		*
	FROM
		Input TIMESTAMP BY Time
)

SELECT * INTO ArchiveOutput FROM ReaderQuery

SELECT 
	Make,
	System.TimeStamp() AS Time,
	COUNT(*) AS [Count] 
INTO AlertOutput 
FROM ReaderQuery
GROUP BY
	Make,
	TumblingWindow(second, 10)
HAVING [Count] >= 3

لمزيد من المعلومات، راجع بند WITH.

استعلام تمرير بسيط

يمكن استخدام استعلام تمرير بسيط لنسخ بيانات تدفق الإدخال إلى المخرج. على سبيل المثال، إذا كان هناك تدفق بيانات يحتوي على معلومات مركبة في الوقت الحقيقي يحتاج إلى حفظ في قاعدة بيانات SQL لتحليلها لاحقا، فإن استعلام تمرير بسيط يؤدي الغرض.

ضع في اعتبارك المدخلات التالية:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

تريد أن يكون المخرج نفسه المدخل:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

إليك السؤال:

SELECT
	*
INTO Output
FROM Input

يقوم استعلام SELECT * بعرض جميع حقول الحدث الوارد وإرسالها إلى المخرج. بدلا من ذلك، يمكنك إسقاط الحقول المطلوبة فقط في بيان SELECT . في المثال التالي، يعرض بيان SELECT فقط حقلي الصنعوالوقت من بيانات الإدخال.

ضع في اعتبارك المدخلات التالية:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |

تريد أن يكون الناتج يحتوي فقط على حقلي الصنع والوقت:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:04.0000000Z |

إليك الاستعلام الذي يعرض فقط الحقول المطلوبة:

SELECT
	Make, Time
INTO Output
FROM Input

مطابقة الأوتار مع LIKE وNOT LIKE

يمكن استخدام LIKEوNOT LIKE للتحقق مما إذا كان الحقل يطابق نمطا معينا. على سبيل المثال، يمكنك استخدام مرشح لإعادة لوحات السيارات فقط التي تبدأ بالحرف A وتنتهي بالرقم 9.

ضع في اعتبارك المدخلات التالية:

| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

تريد أن يحتوي المخرجات على لوحات ترخيص تبدأ بالحرف A وتنتهي بالرقم 9:

| Make | License_plate | Time |
| --- | --- | --- |
| Make2 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make3 |ABC-369 |2023-01-01T00:00:03.0000000Z |

إليك استعلام يستخدم عامل LIKE:

SELECT
	*
FROM
	Input TIMESTAMP BY Time
WHERE
	License_plate LIKE 'A%9'

استخدم عبارة LIKE للتحقق من قيمة الحقل License_plate . يجب أن يبدأ بالحرف A، ثم يحتوي على أي سلسلة من صفر أو أكثر من الحروف، وتنتهي بالرقم 9.

الحساب على الأحداث الماضية

يمكن استخدام دالة LAG للنظر إلى الأحداث السابقة ضمن نافذة زمنية ومقارنتها بالحدث الحالي. على سبيل المثال، يمكن إخراج نوع السيارة الحالية إذا كان مختلفا عن نوع السيارة السابقة التي مرت عبر بوابة الرسوم.

مدخلات نموذجية:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |

مخرجات العينة:

| Make | Time |
| --- | --- |
| Make2 |2023-01-01T00:00:02.0000000Z |

استعلام نموذجي:

SELECT
	Make,
	Time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(minute, 1)) <> Make

استخدم LAG للنظر إلى تدفق الإدخال بعد حدث واحد، ثم استرجاع قيمة Make ومقارنتها بقيمة Make للحدث الحالي وإخراج الحدث.

لمزيد من المعلومات، راجع LAG.

أعد الحدث الأخير في نافذة

وبما أن النظام يستهلك الأحداث في الوقت الحقيقي، فلا توجد وظيفة يمكنها تحديد ما إذا كان الحدث هو آخر حدث يصل في تلك الفترة الزمنية. لتحقيق ذلك، يجب ربط تدفق الإدخال بتدفق آخر حيث يكون وقت الحدث هو الحد الأقصى لجميع الأحداث في تلك النافذة.

مدخلات نموذجية:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

عينة من النتائج مع معلومات عن آخر السيارات في نافذتين زمنيتهما عشر دقائق:

| License_plate | Make | Time |
| --- | --- | --- |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

استعلام نموذجي:

WITH LastInWindow AS
(
	SELECT 
		MAX(Time) AS LastEventTime
	FROM 
		Input TIMESTAMP BY Time
	GROUP BY 
		TumblingWindow(minute, 10)
)

SELECT 
	Input.License_plate,
	Input.Make,
	Input.Time
FROM
	Input TIMESTAMP BY Time 
	INNER JOIN LastInWindow
	ON DATEDIFF(minute, Input, LastInWindow) BETWEEN 0 AND 10
	AND Input.Time = LastInWindow.LastEventTime

الخطوة الأولى في الاستعلام تجد الحد الأقصى للطابع الزمني في نوافذ مدتها 10 دقائق، أي الطابع الزمني لآخر حدث لتلك النافذة. تربط الخطوة الثانية نتائج الاستعلام الأول مع التدفق الأصلي للعثور على الحدث الذي يطابق آخر طوابع زمنية في كل نافذة.

دالة DATEDIFF هي دالة خاصة بالتاريخ تقارن وتعيد فرق الزمن بين حقلين من DateTime، وللمزيد من المعلومات، راجع دوال التاريخ.

لمزيد من المعلومات حول الانضمام إلى البث، راجع JOIN.

تجميع البيانات عبر الزمن

لحساب المعلومات خلال فترة زمنية، يمكنك تجميع البيانات. في هذا المثال، يحسب البيان عدا خلال آخر 10 ثوان من الزمن لكل طراز محدد من سيارة.

مدخلات نموذجية:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |1000 |
| Make1 |2023-01-01T00:00:02.0000000Z |2000 |
| Make2 |2023-01-01T00:00:04.0000000Z |1500 |

مخرجات العينة:

| Make | Count |
| --- | --- |
| Make1 | 2 |
| Make2 | 1 |

الاستعلام:

SELECT
	Make,
	COUNT(*) AS Count
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

هذا التجميع يجمع السيارات حسب الصنع ويعدها كل 10 ثوان. الإنتاج يحتوي على رقم الصنعوالعدد للسيارات التي مرت عبر كشان الرسوم.

TumblingWindow هي وظيفة نافذة تستخدم لتجميع الأحداث معا. يمكن تطبيق التجميع على جميع الأحداث المجمعة. لمزيد من المعلومات، انظر وظائف النافذة.

لمزيد من المعلومات حول التجميع، انظر الدوال المجمعة.

القيم الدورية المخرجة

عندما تكون الأحداث مفقودة أو غير منتظمة، يمكن توليد مخرج فترة منتظمة من مدخل بيانات أكثر انتشارا. على سبيل المثال، توليد حدث كل 5 ثوان يبلغ عن أحدث نقطة بيانات مرئية.

مدخلات نموذجية:

| Time | Value |
| --- | --- |
| "2014-01-01T06:01:00" |1 |
| "2014-01-01T06:01:05" |2 |
| "2014-01-01T06:01:10" |3 |
| "2014-01-01T06:01:15" |4 |
| "2014-01-01T06:01:30" |5 |
| "2014-01-01T06:01:35" |6 |

مخرج العينة (أول 10 صفوف):

| Window_end | Last_event.Time | Last_event.Value |
| --- | --- | --- |
| 2014-01-01T14:01:00.000Z |2014-01-01T14:01:00.000Z |1 |
| 2014-01-01T14:01:05.000Z |2014-01-01T14:01:05.000Z |2 |
| 2014-01-01T14:01:10.000Z |2014-01-01T14:01:10.000Z |3 |
| 2014-01-01T14:01:15.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:20.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:25.000Z |2014-01-01T14:01:15.000Z |4 |
| 2014-01-01T14:01:30.000Z |2014-01-01T14:01:30.000Z |5 |
| 2014-01-01T14:01:35.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:40.000Z |2014-01-01T14:01:35.000Z |6 |
| 2014-01-01T14:01:45.000Z |2014-01-01T14:01:35.000Z |6 |

استعلام نموذجي:

SELECT
	System.Timestamp() AS Window_end,
	TopOne() OVER (ORDER BY Time DESC) AS Last_event
FROM
	Input TIMESTAMP BY Time
GROUP BY
	HOPPINGWINDOW(second, 300, 5)

يقوم هذا الاستعلام بتوليد أحداث كل 5 ثوان ويخرج آخر حدث تم استلامه سابقا. مدة نافذة القفز تحدد مدى الرجوع الذي ينظر إليه الاستعلام للعثور على الحدث الأخير.

لمزيد من المعلومات، راجع نافذة القفز.

ربط الأحداث في جدول

يمكن ربط الأحداث في نفس التدفق من خلال النظر إلى الأحداث السابقة باستخدام دالة LAG . على سبيل المثال، يمكن توليد مخرج في كل مرة تمر فيها سيارتان متتاليتان من نفس مارك عبر كشك الرسوم خلال آخر 90 ثانية.

مدخلات نموذجية:

| Make | License_plate | Time |
| --- | --- | --- |
| Make1 |ABC-123 |2023-01-01T00:00:01.0000000Z |
| Make1 |AAA-999 |2023-01-01T00:00:02.0000000Z |
| Make2 |DEF-987 |2023-01-01T00:00:03.0000000Z |
| Make1 |GHI-345 |2023-01-01T00:00:04.0000000Z |

مخرجات العينة:

| Make | Time | Current_car_license_plate | First_car_license_plate | First_car_time |
| --- | --- | --- | --- | --- |
| Make1 |2023-01-01T00:00:02.0000000Z |AAA-999 |ABC-123 |2023-01-01T00:00:01.0000000Z |

استعلام نموذجي:

SELECT
	Make,
	Time,
	License_plate AS Current_car_license_plate,
	LAG(License_plate, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_license_plate,
	LAG(Time, 1) OVER (LIMIT DURATION(second, 90)) AS First_car_time
FROM
	Input TIMESTAMP BY Time
WHERE
	LAG(Make, 1) OVER (LIMIT DURATION(second, 90)) = Make

يمكن لدالة LAG النظر إلى تدفق الإدخال مرة واحدة للخلف واسترجاع قيمة Make ، مقارنتها بقيمة Make للحدث الحالي. بمجرد تحقيق الشرط، يمكن إسقاط بيانات الحدث السابق باستخدام LAG في عبارة SELECT .

لمزيد من المعلومات، راجع LAG.

اكتشاف المدة بين الأحداث

يمكن حساب مدة الحدث بالنظر إلى آخر حدث بداية بمجرد استلام حدث النهاية. يمكن أن يكون هذا الاستعلام مفيدا لتحديد الوقت الذي يقضيه المستخدم في صفحة أو ميزة.

مدخلات نموذجية:

| User | Feature | Event | Time |
| --- | --- | --- | --- |
| user@location.com |RightMenu |Start |2023-01-01T00:00:01.0000000Z |
| user@location.com |RightMenu |End |2023-01-01T00:00:08.0000000Z |

مخرجات العينة:

| User | Feature | Duration |
| --- | --- | --- |
| user@location.com |RightMenu |7 |

استعلام نموذجي:

SELECT
	[user],
	feature,
	DATEDIFF(
		second,
		LAST(Time) OVER (PARTITION BY [user], feature LIMIT DURATION(hour, 1) WHEN Event = 'start'),
		Time) as duration
FROM input TIMESTAMP BY Time
WHERE
	Event = 'end'

يمكن استخدام دالة LAST لاسترجاع الحدث الأخير ضمن حالة محددة. في هذا المثال، الشرط هو حدث من نوع Start، يقسم البحث حسب PARTITION BY المستخدم والميزة. بهذه الطريقة، يتم التعامل مع كل مستخدم وميزة بشكل مستقل عند البحث عن حدث البداية. تحديد مدة البحث في الوقت إلى ساعة واحدة بين أحداث النهاية والبدء.

عد القيم الفريدة

يمكن استخدام COUNT و DISTINCT لعد عدد قيم الحقول الفريدة التي تظهر في التدفق ضمن نافذة زمنية. يمكنك إنشاء استعلام لحساب عدد أنواع السيارات الفريدة التي مرت عبر بوابة الرسوم خلال نافذة زمنية مدتها ثانيتين.

مدخلات نموذجية:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make1 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

مخرجات العينة:

| Count_make | Time |
| --- | --- |
| 2 |2023-01-01T00:00:02.000Z |
| 1 |2023-01-01T00:00:04.000Z |

استعلام نموذجي:

SELECT
     COUNT(DISTINCT Make) AS Count_make,
     System.TIMESTAMP() AS Time
FROM Input TIMESTAMP BY TIME
GROUP BY 
     TumblingWindow(second, 2)

يعيد COUNT(DISTINCT Make) عدد القيم المميزة في عمود الصنع ضمن نافذة زمنية. لمزيد من المعلومات، انظر دالة التجميع COUNT.

استرجاع الحدث الأول في نافذة

يمكنك استخدامه IsFirst لاسترجاع الحدث الأول في نافذة زمنية. على سبيل المثال، إصدار أول معلومات عن السيارة كل 10 دقائق.

مدخلات نموذجية:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| RMV 8282 |Make1 |2023-07-27T00:05:01.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| VFE 1616 |Make2 |2023-07-27T00:09:31.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

مخرجات العينة:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |

استعلام نموذجي:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) = 1

يمكن ل IsFirst أيضا تقسيم البيانات وحساب أول حدث لكل سيارة محددة يتم العثور عليها في كل فترة زمنية مدتها 10 دقائق.

مخرجات العينة:

| License_plate | Make | Time |
| --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:05.0000000Z |
| YZK 5704 |Make3 |2023-07-27T00:02:17.0000000Z |
| YHN 6970 |Make2 |2023-07-27T00:06:00.0000000Z |
| QYF 9358 |Make1 |2023-07-27T00:12:02.0000000Z |
| MDR 6128 |Make4 |2023-07-27T00:13:45.0000000Z |

استعلام نموذجي:

SELECT 
	License_plate,
	Make,
	Time
FROM 
	Input TIMESTAMP BY Time
WHERE 
	IsFirst(minute, 10) OVER (PARTITION BY Make) = 1

لمزيد من المعلومات، راجع IsFirst.

إزالة الأحداث المكررة في نافذة

عند إجراء عملية مثل حساب المتوسطات على الأحداث في نافذة زمنية معينة، يجب تصفية الأحداث المكررة. في المثال التالي، الحدث الثاني هو تكرار للحدث الأول.

مدخلات نموذجية:

| DeviceId | Time | Attribute | Value |
| --- | --- | --- | --- |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:01.0000000Z |Temperature |50 |
| 2 |2018-07-27T00:00:01.0000000Z |Temperature |40 |
| 1 |2018-07-27T00:00:05.0000000Z |Temperature |60 |
| 2 |2018-07-27T00:00:05.0000000Z |Temperature |50 |
| 1 |2018-07-27T00:00:10.0000000Z |Temperature |100 |

مخرجات العينة:

| AverageValue | DeviceId |
| --- | --- |
| 70 | 1 |
|45 | 2 |

استعلام نموذجي:

WITH Temp AS (
	SELECT Value, DeviceId
	FROM Input TIMESTAMP BY Time
	GROUP BY Value, DeviceId, System.Timestamp()
)
 

SELECT
	AVG(Value) AS AverageValue, DeviceId
INTO Output
FROM Temp
GROUP BY DeviceId,TumblingWindow(minute, 5)

عند تنفيذ العبارة الأولى، يتم دمج السجلات المكررة في واحدة لأن الحقول في المجموعة حسب الجملة كلها متشابهة. لذلك، يزيل النسخ المكررة.

حدد المنطق للحالات/القيم المختلفة (عبارات CASE)

يمكن أن توفر عبارات CASE حسابات مختلفة لمجالات مختلفة، بناء على معيار معين. على سبيل المثال، خصص المسار A لسيارات أي Make1 ماركة أخرى.B

مدخلات نموذجية:

| Make | Time |
| --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |
| Make2 |2023-01-01T00:00:02.0000000Z |
| Make2 |2023-01-01T00:00:03.0000000Z |

مخرجات العينة:

| Make |Dispatch_to_lane | Time |
| --- | --- | --- |
| Make1 |"A" |2023-01-01T00:00:01.0000000Z |
| Make2 |"B" |2023-01-01T00:00:02.0000000Z |

استعلام نموذجي:

SELECT
	Make
	CASE
		WHEN Make = "Make1" THEN "A"
		ELSE "B"
	END AS Dispatch_to_lane,
	System.TimeStamp() AS Time
FROM
	Input TIMESTAMP BY Time

يقارن تعبير CASE تعبيرا بمجموعة من التعبيرات البسيطة لتحديد نتيجته. في هذا المثال، يتم إرسال المركبات إلى Make1 المسار A بينما يتم تخصيص المركبات من أي نوع آخر إلى المسار B.

لمزيد من المعلومات، انظر تعبير الحالة.

تحويل البيانات

يمكن إرسال البيانات في الوقت الحقيقي باستخدام طريقة CAST . على سبيل المثال، يمكن تحويل وزن السيارة من النوع nvarchar(max) إلى type bigint واستخدامه في حساب رقمي.

مدخلات نموذجية:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |"1000" |
| Make1 |2023-01-01T00:00:02.0000000Z |"2000" |

مخرجات العينة:

| Make | Weight |
| --- | --- |
| Make1 |3000 |

استعلام نموذجي:

SELECT
	Make,
	SUM(CAST(Weight AS BIGINT)) AS Weight
FROM
	Input TIMESTAMP BY Time
GROUP BY
	Make,
	TumblingWindow(second, 10)

استخدم عبارة CAST لتحديد نوع بياناتها. راجع قائمة أنواع البيانات المدعومة على أنواع البيانات (Azure Stream Analytics).

لمزيد من المعلومات حول وظائف تحويل البيانات.

اكتشاف مدة الحالة

بالنسبة للظروف التي تمتد عبر أحداث متعددة، يمكن استخدام دالة LAG لتحديد مدة تلك الحالة. على سبيل المثال، افترض أن خطأ ما أدى إلى أن جميع السيارات تحمل وزنا غير صحيح (أكثر من 20,000 رطل)، ويجب حساب مدة ذلك الخطأ.

مدخلات نموذجية:

| Make | Time | Weight |
| --- | --- | --- |
| Make1 |2023-01-01T00:00:01.0000000Z |2000 |
| Make2 |2023-01-01T00:00:02.0000000Z |25000 |
| Make1 |2023-01-01T00:00:03.0000000Z |26000 |
| Make2 |2023-01-01T00:00:04.0000000Z |25000 |
| Make1 |2023-01-01T00:00:05.0000000Z |26000 |
| Make2 |2023-01-01T00:00:06.0000000Z |25000 |
| Make1 |2023-01-01T00:00:07.0000000Z |26000 |
| Make2 |2023-01-01T00:00:08.0000000Z |2000 |

مخرجات العينة:

| Start_fault | End_fault |
| --- | --- |
| 2023-01-01T00:00:02.000Z |2023-01-01T00:00:07.000Z |

استعلام نموذجي:

WITH SelectPreviousEvent AS
(
SELECT
	*,
	LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous_time,
	LAG([weight]) OVER (LIMIT DURATION(hour, 24)) as previous_weight
FROM input TIMESTAMP BY [time]
)

SELECT 
	LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_weight < 20000 ) [Start_fault],
	previous_time [End_fault]
FROM SelectPreviousEvent
WHERE
	[weight] < 20000
	AND previous_weight > 20000

تربط أول عبارة SELECT قياس الوزن الحالي مع القياس السابق، وتعرضه مع القياس الحالي. النسخة الثانية من SELECT تعود إلى الحدث الأخير حيث كان previous_weight أقل من 20000، حيث الوزن الحالي أقل من 20000 وكان previous_weight الحدث الحالي أكبر من 20000.

End_fault هو الحدث الحالي غير المعيب حيث كان الحدث السابق معيبا، و Start_fault هو آخر حدث غير معيب قبل ذلك.

معالجة الأحداث ذات الزمن المستقل (التيارات الفرعية)

يمكن أن تصل الأحداث متأخرة أو غير مرتبة بسبب انحناءات الساعة بين منتجي الأحداث، أو انحرافات الساعة بين الأقسام، أو تأخير الشبكة. على سبيل المثال، ساعة الجهاز في TollID 2 متأخرة بخمس ثوان عن TollID 1، وساعة الجهاز في TollID 3 متأخرة بعشر ثوان عن TollID 1. يمكن أن تحدث عملية حسابية بشكل مستقل لكل رسوم، مع الاعتبار فقط بيانات الساعة الخاصة بها كطابع زمني.

مدخلات نموذجية:

| LicensePlate | Make | Time | TollID |
| --- | --- | --- | --- |
| DXE 5291 |Make1 |2023-07-27T00:00:01.0000000Z | 1 |
| YHN 6970 |Make2 |2023-07-27T00:00:05.0000000Z | 1 |
| QYF 9358 |Make1 |2023-07-27T00:00:01.0000000Z | 2 |
| GXF 9462 |Make3 |2023-07-27T00:00:04.0000000Z | 2 |
| VFE 1616 |Make2 |2023-07-27T00:00:10.0000000Z | 1 |
| RMV 8282 |Make1 |2023-07-27T00:00:03.0000000Z | 3 |
| MDR 6128 |Make3 |2023-07-27T00:00:11.0000000Z | 2 |
| YZK 5704 |Make4 |2023-07-27T00:00:07.0000000Z | 3 |

مخرجات العينة:

| TollID | Count |
| --- | --- |
| 1 | 2 |
| 2 | 2 |
| 1 | 1 |
| 3 | 1 |
| 2 | 1 |
| 3 | 1 |

استعلام نموذجي:

SELECT
      TollId,
      COUNT(*) AS Count
FROM input
      TIMESTAMP BY Time OVER TollId
GROUP BY TUMBLINGWINDOW(second, 5), TollId

جملة TIMESTAMP OVER BY تنظر إلى كل جدول زمني لكل جهاز بشكل مستقل باستخدام التدفقات الفرعية. يتم توليد حدث الإخراج لكل TollID أثناء حسابه، مما يعني أن الأحداث مرتبة بالنسبة لكل TollID بدلا من إعادة ترتيبها كما لو أن جميع الأجهزة تعمل على نفس الساعة.

لمزيد من المعلومات، راجع الطابع الزمني BY ABOVE.

نوافذ الجلسات

نافذة الجلسة هي نافذة تستمر في التوسع مع حدوث الأحداث وتغلق للحساب إذا لم يتم استقبال حدث بعد فترة زمنية محددة أو إذا وصلت النافذة إلى أقصى مدة لها. تعد هذه النافذة مفيدة بشكل خاص عند حساب بيانات تفاعل المستخدمين. تبدأ النافذة عندما يبدأ المستخدم بالتفاعل مع النظام وتغلق عندما لا تلاحظ أي أحداث أخرى، مما يعني أن المستخدم توقف عن التفاعل. على سبيل المثال، إذا تفاعل المستخدم مع صفحة ويب يتم تسجيل عدد النقرات فيها، يمكن استخدام نافذة الجلسة لمعرفة مدة تفاعل المستخدم مع الموقع.

مدخلات نموذجية:

| User_id | Time | URL |
| --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | "www.example.com/a.html" |
| 0 | 2017-01-26T00:00:20.0000000Z | "www.example.com/b.html" |
| 1 | 2017-01-26T00:00:55.0000000Z | "www.example.com/c.html" |
| 0 | 2017-01-26T00:01:10.0000000Z | "www.example.com/d.html" |
| 1 | 2017-01-26T00:01:15.0000000Z | "www.example.com/e.html" |

مخرجات العينة:

| User_id | StartTime | EndTime | Duration_in_seconds |
| --- | --- | --- | --- |
| 0 | 2017-01-26T00:00:00.0000000Z | 2017-01-26T00:01:10.0000000Z | 70 |
| 1 | 2017-01-26T00:00:55.0000000Z | 2017-01-26T00:01:15.0000000Z | 20 |

استعلام نموذجي:

SELECT
	user_id,
	MIN(time) as StartTime,
	MAX(time) as EndTime,
	DATEDIFF(second, MIN(time), MAX(time)) AS duration_in_seconds
FROM input TIMESTAMP BY time
GROUP BY
	user_id,
	SessionWindow(minute, 1, 60) OVER (PARTITION BY user_id)

يقوم SELECT بعرض البيانات ذات الصلة بتفاعل المستخدم، بالإضافة إلى مدة التفاعل. تجميع البيانات حسب المستخدم ونافذة جلسة تغلق إذا لم يحدث تفاعل خلال دقيقة واحدة، مع حد أقصى لحجم نافذة يبلغ 60 دقيقة.

لمزيد من المعلومات حول SessionWindow، راجع نافذة الجلسة .

الدوال المعرفة من قبل المستخدم في جافا سكريبت وC#

ملحوظة

هذا القسم لا ينطبق على Fabric Eventstream.

يمكن توسيع لغة الاستعلام في Azure Stream Analytics بدوال مخصصة مكتوبة إما بلغة JavaScript أو C#. الدوال المعرفة من قبل المستخدم (UDF) هي حسابات مخصصة أو معقدة لا يمكن التعبير عنها بسهولة باستخدام لغة SQL . يمكن تعريف هذه ال UDFs مرة واحدة واستخدامها عدة مرات داخل الاستعلام. على سبيل المثال، يمكن استخدام UDF لتحويل قيمة nvarchar (max) سداسية عشرية إلى قيمة bigint .

مدخلات نموذجية:

| Device_id | HexValue |
| --- | --- |
| 1 | "B4" |
| 2 | "11B" |
| 3 | "121" |

مخرجات العينة:

| Device_id | Decimal |
| --- | --- |
| 1 | 180 |
| 2 | 283 |
| 3 | 289 |
function hex2Int(hexValue){
	return parseInt(hexValue, 16);
}
public static class MyUdfClass {
	public static long Hex2Int(string hexValue){
		return int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
	}
}
SELECT
	Device_id,
	udf.Hex2Int(HexValue) AS Decimal
From
	Input

دالة User-Defined تحسب القيمة الكبيرة من القيمة السداسية لكل حدث يستهلك.

لمزيد من المعلومات، راجع JavaScript و C#‎.

مطابقة الأنماط المتقدمة مع MATCH_RECOGNIZE

MATCH_RECOGNIZE هو آلية متقدمة لمطابقة الأنماط يمكن استخدامها لمطابقة تسلسل من الأحداث مع نمط تعبير منتظم محدد جيدا. على سبيل المثال، يتم مراقبة جهاز ATM في الوقت الحقيقي بحثا عن الأعطال، وأثناء تشغيل الجهاز، إذا كانت هناك رسالتان تحذيرتان متتاليتان يجب إبلاغ المسؤول.

المدخلات:

| ATM_id | Operation_id | Return_Code | Time |
| --- | --- | --- | --- |
| 1 | "Entering Pin" | "Success" | 2017-01-26T00:10:00.0000000Z |
| 2 | "Opening Money Slot" | "Success" | 2017-01-26T00:10:07.0000000Z |
| 2 | "Closing Money Slot" | "Success" | 2017-01-26T00:10:11.0000000Z |
| 1 | "Entering Withdraw Quantity" | "Success" | 2017-01-26T00:10:08.0000000Z |
| 1 | "Opening Money Slot" | "Warning" | 2017-01-26T00:10:14.0000000Z |
| 1 | "Printing Bank Balance" | "Warning" | 2017-01-26T00:10:19.0000000Z |

إخراج:

| ATM_id | First_Warning_Operation_id | Warning_Time |
| --- | --- | --- |
| 1 | "Opening Money Slot" | 2017-01-26T00:10:14.0000000Z |
SELECT *
FROM input TIMESTAMP BY time OVER ATM_id
MATCH_RECOGNIZE (
	LIMIT DURATION(minute, 1)
	PARTITION BY ATM_id
	MEASURES
		First(Warning.ATM_id) AS ATM_id,
		First(Warning.Operation_Id) AS First_Warning_Operation_id,
		First(Warning.Time) AS Warning_Time
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN (Success+ Warning{2,})
	DEFINE
		Success AS Success.Return_Code = 'Success',
		Warning AS Warning.Return_Code <> 'Success'
) AS patternMatch

تطابق هذه الاستعلام على الأقل حدثين فشل متتاليين ويولد إنذارا عند استيفاء الشروط. يعرف PATTERN التعبير النمطي المستخدم في المطابقة، وفي هذه الحالة، على الأقل تحذيرين متتاليين بعد عملية ناجحة واحدة على الأقل. يتم تعريف النجاح والتحذير باستخدام القيمة Return_Code وبمجرد تحقيق الشرط. يتم عرض MEASURES** مع تشغيل ATM_id، أول عملية تحذير، وأول وقت تحذير.

لمزيد من المعلومات، انظر MATCH_RECOGNIZE.

التحديد الجغرافي والاستعلامات الجغرافية المكانية

يوفر Azure Stream Analytics وظائف جغرافية مكانية مدمجة يمكن استخدامها لتنفيذ سيناريوهات مثل إدارة الأسطول، ومشاركة الركوب، والسيارات المتصلة، وتتبع الأصول. يمكن استيعاب البيانات الجغرافية المكانية بصيغ GeoJSON أو WKT كجزء من بيانات تدفق الأحداث أو البيانات المرجعية. على سبيل المثال، شركة متخصصة في تصنيع آلات طباعة جوازات السفر تؤجر آلاتها للحكومات والقنصليات. يتم التحكم بشكل صارم في موقع هذه الأجهزة لتجنب فقدان وإمكانية استخدامها في تزوير جوازات السفر. كل جهاز مزود بجهاز تتبع GPS، ويتم نقل هذه المعلومات إلى وظيفة Azure Stream Analytics. ترغب الشركة المصنعة في تتبع موقع تلك الأجهزة وأن يتم تنبيه أي منها إذا غادر أحدها منطقة مصرح بها، وبهذه الطريقة يمكنهم تعطيل الجهاز، وإبلاغ السلطات، واستعادة المعدات.

المدخلات:

| Equipment_id | Equipment_current_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13288797982818 47.64082002051315)" | 2017-01-26T00:10:00.0000000Z |
| 1 | "POINT(-122.13307252987875 47.64081350934929)" | 2017-01-26T00:11:00.0000000Z |
| 1 | "POINT(-122.13308862313283 47.6406508603241)" | 2017-01-26T00:12:00.0000000Z |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |

إدخال بيانات مرجعية:

| Equipment_id | Equipment_lease_location |
| --- | --- |
| 1 | "POLYGON((-122.13326028450979 47.6409833866794,-122.13261655434621 47.6409833866794,-122.13261655434621 47.64061471602751,-122.13326028450979 47.64061471602751,-122.13326028450979 47.6409833866794))" |

إخراج:

| Equipment_id | Equipment_alert_location | Time |
| --- | --- | --- |
| 1 | "POINT(-122.13341048821462 47.64043760861279)" | 2017-01-26T00:13:00.0000000Z |
SELECT
	input.Equipment_id AS Equipment_id,
	input.Equipment_current_location AS Equipment_current_location,
	input.Time AS Time
FROM input TIMESTAMP BY time
JOIN
	referenceInput 
	ON input.Equipment_id = referenceInput.Equipment_id
	WHERE 
		ST_WITHIN(input.Equipment_current_location, referenceInput.Equipment_lease_location) = 1

يتيح الاستعلام للمصنع مراقبة موقع الجهاز تلقائيا، حيث يحصل على تنبيهات عند مغادرة الجهاز الحاجز الجغرافي المسموح به. تتيح الوظيفة الجغرافية المكانية المدمجة للمستخدمين استخدام بيانات GPS داخل الاستعلام دون الحاجة إلى مكتبات طرف ثالث.

لمزيد من المعلومات، راجع مقال السيناريوهات حول التجميع الجغرافي والجغرافي المكاني مع Azure Stream Analytics .

الحصول على المساعدة

لمزيد من المساعدة، جرب صفحة سؤال Microsoft Q&A الخاصة بنا ل Azure Stream Analytics.

الخطوات التالية