تنفيذ التجميعات المعرفة من قبل المستخدم في JavaScript في Azure Stream Analytics

يدعم Azure Stream Analytics التجميعات المعرفة من قبل المستخدم (UDA) المكتوبة بلغة JavaScript حتى تتمكن من تنفيذ منطق الأعمال المعقد ذو الحالة. مع UDA، لديك سيطرة كاملة على هيكل بيانات الحالة، وتراكم الحالة، وتفكيك الحالات، وحساب النتائج الإجمالية.

استخدم UDA بجافاسكريبت عندما لا تلبي دوال التجميع المدمجة احتياجاتك وتريد تجميع الأحداث النافذة باستخدام خوارزميتك الخاصة.

توضح لك هذه المقالة كيفية إنشاء UDA وكيفية استدعاؤه باستخدام العمليات القائمة على النوافذ في استعلام تحليلات التدفق.

المتطلبات المسبقه

قبل أن تبدأ، تأكد من أنك حصلت على:

اختر نوع تجميع معرف من قبل المستخدم في JavaScript

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

تعمل AccumulateDeaccumulate المجمعات بشكل أفضل من AccumulateOnly عند استخدامها مع نوافذ القفز والانزلاق والجلسات، لأن Stream Analytics يمكنه إزالة الأحداث من الحالة بدلا من إعادة حسابها.

تجميعات غير متراكمة

التراكم: يمكن فقط تراكم الأحداث الجديدة في حالتها. الخوارزمية لا تسمح بإزالة تراكم القيم. اختر هذا النوع عندما لا يمكنك إزالة معلومات حدث من قيمة الحالة. الكود التالي هو قالب JavaScript لتجميعات Cumulative Only:

// Sample UDA which state can only be accumulated.
function main() {
    this.init = function () {
        this.state = 0;
    }

    this.accumulate = function (value, timestamp) {
        this.state += value;
    }

    this.computeResult = function () {
        return this.state;
    }
}

تجميع تراكمي

تراكم: التراكم: تتراكم المجمعات تفقد قيمة تراكم سابقة من الحالة. على سبيل المثال، يمكنك إزالة زوج مفتاح-قيمة من قائمة قيم الأحداث أو طرح قيمة من مجموع المجموع. الكود التالي هو قالب JavaScript ل Accumulate Deaccumulate تجمعات:

// Sample UDA which state can be accumulated and deaccumulated.
function main() {
    this.init = function () {
        this.state = 0;
    }

    this.accumulate = function (value, timestamp) {
        this.state += value;
    }

    this.deaccumulate = function (value, timestamp) {
        this.state -= value;
    }

    this.deaccumulateState = function (otherState){
        this.state -= otherState.state;
    }

    this.computeResult = function () {
        return this.state;
    }
}

فهم إعلان دالة جافاسكريبت

يحدد إعلان كائن الدالة كل UDA في جافا سكريبت. تصف القائمة التالية العناصر الرئيسية في تعريف UDA.

الاسم المستعار للدالة

اسم الوظيفة المستمرة هو معرف UDA. عندما تتصل ب UDA في استعلام تحليلات التدفق، استخدم دائما الاسم المستعار مع uda. بادئة (بادئة).

نوع الدالة

بالنسبة لUDA، قم بتعيين نوع الدالة إلى JavaScript UDA.

نوع الإخراج

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

اسم الوظيفة

اسم كائن الدالة. يجب أن يتطابق اسم الدالة مع اسم UDA المستعار.

الطريقة: init()

تقوم الطريقة init() بتهيئة حالة التجميع. تستدعي Stream Analytics هذه الطريقة عند بدء النافذة.

الطريقة: التراكم()

تحسب الطريقة accumulate() حالة UDA بناء على الحالة السابقة وقيم الأحداث الحالية. تستدعي تحليلات التدفق هذه الطريقة عندما يدخل حدث نافذة زمنية (TumblingWindow، HoppingWindow، SlidingWindow، أو SessionWindow).

الطريقة: التراكم()

تعيد الطريقة deaccumulate() حساب الحالة بناء على الحالة السابقة وقيم الأحداث الحالية. تستدعي تحليلات التدفق هذه الطريقة عندما يغادر حدث أو SlidingWindowSessionWindow.

الطريقة: deaccumulateState()

تعيد الطريقة deaccumulateState() حساب الحالة بناء على الحالة السابقة وحالة القفزة. تستدعي تحليلات التدفق هذه الطريقة عندما تترك مجموعة من الأحداث .HoppingWindow

الطريقة: computeResult()

computeResult() تعيد الطريقة نتيجة التجميع بناء على الحالة الحالية. تستدعي تحليلات التدفق هذه الطريقة في نهاية نافذة زمنية (TumblingWindow, HoppingWindow, SlidingWindow, أو SessionWindow).

راجع أنواع بيانات المدخلات والمخرجات المدعومة

تستخدم التجميعات المعرفة من قبل المستخدم في JavaScript نفس تحويلات نوع الإدخال والإخراج كما تستخدم وظائف JavaScript المعرفة من قبل المستخدم (UDF). للاطلاع على الربط الكامل بين أنواع بيانات Stream Analytics وأنواع بيانات JavaScript، راجع قسم تحليلات التدفق وتحويل أنواع JavaScript في Integration JavaScript UDFs.

إضافة UDA بجافاسكريبت في بوابة Azure

في هذا القسم، تنشئ UDA يحسب متوسطا مرجحا زمنيا. لإنشاء UDA بجافاسكريبت في وظيفة حالية في تحليلات التدفق، اتبع الخطوات التالية:

  1. سجل الدخول إلى بوابة Azure واذهب إلى وظيفتك في تحليلات التدفق (Stream Analytics).

  2. تحت طوبولوجيا الوظائف، اختر الدوال.

  3. اختر الإضافة، ثم اختر JavaScript UDA.

  4. في صفحة الدوال الجديدة ، يظهر قالب UDA افتراضي في المحرر.

  5. أدخل TWA كاسم مستعار للدالة، ثم استبدل تنفيذ الدالة بالرمز التالي:

    // Sample UDA which calculates the time-weighted average of incoming values.
    function main() {
        this.init = function () {
            this.totalValue = 0.0;
            this.totalWeight = 0.0;
        }
    
        this.accumulate = function (value, timestamp) {
            this.totalValue += value.level * value.weight;
            this.totalWeight += value.weight;
    
        }
    
        // Uncomment the following block for an AccumulateDeaccumulate implementation.
        /*
        this.deaccumulate = function (value, timestamp) {
            this.totalValue -= value.level * value.weight;
            this.totalWeight -= value.weight;
        }
    
        this.deaccumulateState = function (otherState){
            this.totalValue -= otherState.totalValue;
            this.totalWeight -= otherState.totalWeight;
        }
        */
    
        this.computeResult = function () {
            if(this.totalValue == 0) {
                result = 0;
            }
            else {
                result = this.totalValue/this.totalWeight;
            }
            return result;
        }
    }
    
  6. اختر حفظ. يظهر UDA الخاص بك في قائمة الوظائف.

  7. اختر دالة TWA الجديدة لمراجعة تعريفها.

استدعي UDA بجافاسكريبت في استعلام تحليلات التدفق

في بوابة Azure، افتح وظيفتك وقم بتحرير الاستعلام. استدعي الدالة TWA() التي تحمل بادئة إلزامية uda. . على سبيل المثال:

WITH value AS
(
    SELECT
    NoiseLevelDB as level,
    DurationSecond as weight
FROM
    [YourInputAlias] TIMESTAMP BY EntryTime
)
SELECT
    System.Timestamp as ts,
    uda.TWA(value) as NoiseDoseTWA
FROM value
GROUP BY TumblingWindow(minute, 5)

اختبر الاستعلام باستخدام UDA

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

[
  {"EntryTime": "2017-06-10T05:01:00-07:00", "NoiseLevelDB": 80, "DurationSecond": 22.0},
  {"EntryTime": "2017-06-10T05:02:00-07:00", "NoiseLevelDB": 81, "DurationSecond": 37.8},
  {"EntryTime": "2017-06-10T05:02:00-07:00", "NoiseLevelDB": 85, "DurationSecond": 26.3},
  {"EntryTime": "2017-06-10T05:03:00-07:00", "NoiseLevelDB": 95, "DurationSecond": 13.7},
  {"EntryTime": "2017-06-10T05:03:00-07:00", "NoiseLevelDB": 88, "DurationSecond": 10.3},
  {"EntryTime": "2017-06-10T05:05:00-07:00", "NoiseLevelDB": 103, "DurationSecond": 5.5},
  {"EntryTime": "2017-06-10T05:06:00-07:00", "NoiseLevelDB": 99, "DurationSecond": 23.0},
  {"EntryTime": "2017-06-10T05:07:00-07:00", "NoiseLevelDB": 108, "DurationSecond": 1.76},
  {"EntryTime": "2017-06-10T05:07:00-07:00", "NoiseLevelDB": 79, "DurationSecond": 17.9},
  {"EntryTime": "2017-06-10T05:08:00-07:00", "NoiseLevelDB": 83, "DurationSecond": 27.1},
  {"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 91, "DurationSecond": 17.1},
  {"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 115, "DurationSecond": 7.9},
  {"EntryTime": "2017-06-10T05:09:00-07:00", "NoiseLevelDB": 80, "DurationSecond": 28.3},
  {"EntryTime": "2017-06-10T05:10:00-07:00", "NoiseLevelDB": 55, "DurationSecond": 18.2},
  {"EntryTime": "2017-06-10T05:10:00-07:00", "NoiseLevelDB": 93, "DurationSecond": 25.8},
  {"EntryTime": "2017-06-10T05:11:00-07:00", "NoiseLevelDB": 83, "DurationSecond": 11.4},
  {"EntryTime": "2017-06-10T05:12:00-07:00", "NoiseLevelDB": 89, "DurationSecond": 7.9},
  {"EntryTime": "2017-06-10T05:15:00-07:00", "NoiseLevelDB": 112, "DurationSecond": 3.7},
  {"EntryTime": "2017-06-10T05:15:00-07:00", "NoiseLevelDB": 93, "DurationSecond": 9.7},
  {"EntryTime": "2017-06-10T05:18:00-07:00", "NoiseLevelDB": 96, "DurationSecond": 3.7},
  {"EntryTime": "2017-06-10T05:20:00-07:00", "NoiseLevelDB": 108, "DurationSecond": 0.99},
  {"EntryTime": "2017-06-10T05:20:00-07:00", "NoiseLevelDB": 113, "DurationSecond": 25.1},
  {"EntryTime": "2017-06-10T05:22:00-07:00", "NoiseLevelDB": 110, "DurationSecond": 5.3}
]