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

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

كتابة تجميعات JavaScript المُحددة من قِبل

يتم استخدام تجميع معرف من قِبل المستخدم أعلى مواصفات النافذة الزمنية للتجميع عبر الأحداث في تلك النافذة وإنتاج قيمة نتيجة واحدة. هناك نوعان من واجهات UDA التي يدعمها Stream Analytics اليوم، AccumulateOnly وSumumeDeaccumulate. يمكن استخدام كِلا النوعين من UDA بواسطة التدوير والتنقل والانزلاق ونافذة الجلسة. أداء UDA ل AccumulateDeaccumulate أفضل من AccumulateOnly UDA عند استخدامه مع Hopping وS المنزلقة ونافذة الجلسة. يمكنك اختيار أحد النوعين استنادًا إلى الخوارزمية التي تستخدمها.

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

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

// 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 لتجميعات AccumulateDeaccumulate:

// 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 - إعلان دالة JavaScript

يتم تعريف كل JavaScript UDA بواسطة إعلان كائن الدالة. فيما يلي العناصر الرئيسية في تعريف UDA.

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

الاسم المستعار للدالة هو معرف UDA. عند استدعائه في استعلام Stream Analytics، استخدم دائمًا الاسم المستعار UDA مع بادئة "uda".

نوع الدالة

بالنسبة إلى UDA، يجب أن يكون نوع الدالة JavaScript UDA.

نوع الإخراج

نوع معين تدعمه مهمة Stream Analytics، أو "أي" إذا كنت تريد معالجة النوع في الاستعلام الخاص بك.

اسم الوظيفة

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

الأسلوب - init()

يقوم أسلوب init() بتهيئة حالة التجميع. يتم استدعاء هذا الأسلوب عند بدء تشغيل النافذة.

الأسلوب – accumulate()

يحسب الأسلوب التراكم () حالة UDA استنادًا إلى الحالة السابقة وقيم الحدث الحالي. يتم استدعاء هذا الأسلوب عندما يدخل حدث نافذة زمنية (TUMBLINGWINDOW أو HOPPINGWINDOW أو SLIDINGWINDOW أو SESSIONWINDOW).

الأسلوب - deaccumulate()

أسلوب deaccumulate() هو إعادة حساب الحالة استنادًا إلى الحالة السابقة وقيم الحدث الحالي. يتم استدعاء هذا الأسلوب عندما يترك حدث SLIDINGWINDOW أو SESSIONWINDOW.

الأسلوب – deaccumulateState()

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

الأسلوب – computeResult()

يقوم أسلوب computeResult() بإرجاع النتيجة الإجمالية استنادًا إلى الحالة الحالية. يتم استدعاء هذا الأسلوب في نهاية نافذة زمنية (TUMBLINGWINDOW أو HOPPINGWINDOW أو SLIDINGWINDOW أو SESSIONWINDOW).

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

بالنسبة إلى أنواع بيانات JavaScript UDA، راجع القسم Stream Analytics وتحويل نوع JavaScriptلدمج JavaScript UDFs.

إضافة JavaScript UDA من مدخل Microsoft Azure

نستعرض أدناه عملية إنشاء UDA من المدخل. المثال الذي نستخدمه هنا هو متوسطات الحوسبة المرجحة للوقت.

الآن دعونا ننشئ JavaScript UDA ضمن وظيفة ASA موجودة باتباع الخطوات التالية.

  1. سجل الدخول إلى مدخل Microsoft Azure وحدد موقع وظيفة Stream Analytics الحالية.

  2. ثم حدد ارتباط الدوال ضمن JOB TOPOLOGY.

  3. حدد إضافة لإضافة دالة جديدة.

  4. في طريقة العرض دالة جديدة، حدد JavaScript UDA كنوع الدالة، ثم ترى قالب UDA الافتراضي يظهر في المحرر.

  5. املأ "TWA" باسم UDA المستعار وغير تنفيذ الدالة كما يلي:

    // Sample UDA which calculate 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 below for AccumulateDeaccumulate implementation
        /*
        this.deaccumulate = function (value, timestamp) {
            this.totalValue -= value.level * value.weight;
            this.totalWeight -= value.weight;
        }
    
        this.deaccumulateState = function (otherState){
            this.state -= otherState.state;
            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"، ويمكنك التحقق من تعريف الدالة.

استدعاء JavaScript UDA في استعلام ASA

في مدخل Microsoft 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 NoseDoseTWA
FROM value
GROUP BY TumblingWindow(minute, 5)

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

إنشاء ملف JSON محلي مع المحتوى أدناه، وتحميل الملف إلى وظيفة Stream Analytics، واختبار الاستعلام أعلاه.

[
  {"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}
]

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

للحصول على تعليمات إضافية، جرب صفحة سؤال Microsoft Q&A الخاصة بنا ل Azure Stream Analytics.

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