Megosztás a következőn keresztül:


Felhasználó által definiált Azure Stream Analytics JavaScript-összesítések

Az Azure Stream Analytics támogatja a JavaScriptben írt, felhasználó által definiált aggregátumokat (UDA), így összetett állapotalapú üzleti logikát valósíthat meg. Az UDA-on belül teljes mértékben szabályozhatja az állapotadatok struktúráját, az állapotfelhalmozást, az állapotok dekumulációját és az összesített eredmények számítását. A cikk bemutatja a két különböző JavaScript UDA-felületet, a UDA létrehozásának lépéseit, valamint az UDA használatát ablakalapú műveletekkel a Stream Analytics-lekérdezésben.

JavaScript felhasználó által definiált összesítések

A felhasználó által definiált összesítés egy időablak-specifikáción felül az adott ablakban lévő események összesítésére és egyetlen eredményérték létrehozására szolgál. A Stream Analytics kétféle UDA-felületet támogat ma, a AccumulateOnly és a AccumulateDeaccumulate felületet. Az UDA mindkét típusát használhatja a csúszás, a felhúzás, a csúszás és a munkamenetablak. A AccumulateDeaccumulate UDA jobban teljesít, mint a AccumulateOnly UDA a Hopping, a Sliding és a Session Window együttes használatakor. A használt algoritmus alapján választhatja ki a két típus egyikét.

Halmozott összesítések

A AccumulateOnly aggregátumok csak új eseményeket halmozhatnak fel az állapotukba, az algoritmus nem teszi lehetővé az értékek deakkumulációját. Ezt az összesített típust akkor válassza, ha az állapotértékből származó eseményinformációk deakkumulálása lehetetlen. Az Alábbiakban az AccumulatOnly-összesítésekhez készült JavaScript-sablon található:

// 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;
    }
}

AccumulateDeaccumulate aggregátumok

A AccumulateDeaccumulate aggregátumok lehetővé teszik egy korábbi halmozott érték deaccumulációját az állapotból, például eltávolíthat egy kulcs-érték párot az eseményértékek listájából, vagy kivonhat egy értéket az összegösszesítés állapotából. Az alábbiakban a AccumulateDeaccumulate összesítések JavaScript-sablonja található:

// 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-függvény deklarációja

Minden JavaScript UDA függvényobjektum-deklarációval van definiálva. Az alábbiakban az UDA-definíció főbb elemeit követjük.

Függvény aliasa

A függvény aliasa az UDA-azonosító. Amikor a Stream Analytics-lekérdezésben meghívják, mindig használjon UDA aliast egy "uda" előtaggal együtt.

Függvény típusa

UDA esetén a függvénytípusnak JavaScript UDA-nak kell lennie.

Kimeneti típus

Egy adott típus, amelyet a Stream Analytics-feladat támogatott, vagy "Bármely", ha a lekérdezésben szereplő típust szeretné kezelni.

Függvénynév

A függvényobjektum neve. A függvény nevének meg kell egyeznie az UDA aliasával.

Metódus – init()

Az init() metódus inicializálja az aggregátum állapotát. Ezt a metódust az ablak indításakor hívjuk meg.

Metódus – halmoz()

A halmozási() metódus kiszámítja az UDA-állapotot az előző állapot és az aktuális eseményértékek alapján. Ezt a metódust akkor nevezzük, ha egy esemény egy időablakba lép (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW vagy Standard kiadás SSIONWINDOW).

Metódus – deaccumulate()

A deaccumulate() metódus újraszámítja az állapotot az előző állapot és az aktuális eseményértékek alapján. Ezt a metódust akkor hívjuk meg, ha egy esemény elhagyja a SLIDINGWINDOW vagy Standard kiadás SSIONWINDOW függvényt.

Metódus – deaccumulateState()

A deaccumulateState() metódus újraszámítja az állapotot az előző állapot és a ugrás állapota alapján. Ezt a metódust akkor hívjuk meg, ha egy eseménykészlet elhagyja a HOPPINGWINDOW-t.

Metódus – computeResult()

A computeResult() metódus az aktuális állapot alapján ad vissza összesített eredményt. Ezt a metódust egy időablak végén hívjuk meg (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW vagy Standard kiadás SSIONWINDOW).

JavaScript UDA által támogatott bemeneti és kimeneti adattípusok

JavaScript UDA-adattípusok esetén tekintse meg a JavaScript UDF-ek integrálásának Stream Analytics és JavaScript típusú konvertálását ismertető szakaszt.

JavaScript UDA hozzáadása az Azure Portalról

Az alábbiakban bemutatjuk, hogyan hozhat létre UDA-t a Portálról. Az alábbi példában a számítási idő súlyozott átlagait használjuk.

Most hozzunk létre egy JavaScript UDA-t egy meglévő ASA-feladat alatt a következő lépésekkel.

  1. Jelentkezzen be az Azure Portalra, és keresse meg a meglévő Stream Analytics-feladatot.

  2. Ezután válassza ki a függvényhivatkozást a JOB TOPOLOGY alatt.

  3. Új függvény hozzáadásához válassza a Hozzáadás lehetőséget.

  4. Az Új függvény nézetben válassza a JavaScript UDA-t függvénytípusként, majd megjelenik egy alapértelmezett UDA-sablon a szerkesztőben.

  5. Töltse ki a "TWA" kifejezést UDA-aliasként, és módosítsa a függvény implementációját az alábbiak szerint:

    // 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. A "Mentés" gomb kiválasztása után az UDA megjelenik a függvénylistában.

  7. Válassza ki az új "TWA" függvényt, és ellenőrizheti a függvénydefiníciót.

JavaScript UDA meghívása ASA-lekérdezésben

Az Azure Portalon szerkessze a lekérdezést, és hívja meg a TWA() függvényt egy "uda" előtaggal. Példa:

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)

Lekérdezés tesztelése az UDA használatával

Hozzon létre egy helyi JSON-fájlt az alábbi tartalommal, töltse fel a fájlt a Stream Analytics-feladatba, és tesztelje a fenti lekérdezést.

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

Segítség kérése

További segítségért próbálja ki a Microsoft Q&A kérdésoldalát az Azure Stream Analyticshez.

Következő lépések