Agregace definované uživatelem definované v Azure Stream Analytics v JavaScriptu

Azure Stream Analytics podporuje uživatelem definované agregace (UDA) napsané v JavaScriptu. Umožňuje implementovat složitou stavovou obchodní logiku. V rámci UDA máte úplnou kontrolu nad strukturou dat stavu, akumulace stavu, deculace stavu a agregace výpočtů výsledků. Tento článek představuje dvě různá rozhraní UDA JavaScriptu, postup vytvoření UDA a použití UDA s operacemi založenými na okně v dotazu Stream Analytics.

Uživatelem definované agregace JavaScriptu

Uživatelem definovaná agregace se používá nad specifikací časového intervalu k agregaci událostí v daném okně a vytvoření jedné výsledné hodnoty. Existují dva typy rozhraní UDA, která Stream Analytics podporuje dnes, KumulovatOnly a KumulovatDeaccumulate. Oba typy UDA lze použít přeskakující, skákání, posuvné okno a okno relace. Kumulace UDA funguje lépe než kumulovaná hodnota UDA při použití společně s skákáním, posuvným a oknem relace. Na základě algoritmu, který používáte, zvolíte jeden ze dvou typů.

Kumulované agregace

Agregace KumulováníOnly můžou do svého stavu hromadit pouze nové události, algoritmus neumožňuje deaccumulace hodnot. Tento agregační typ zvolte, pokud není možné implementovat informace o události z hodnoty stavu. Následuje javascriptová šablona pro agregace Nashromážděné:

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

Kumulované agregace

Kumulované agregace Umožňují deaccumulaci předchozí kumulované hodnoty ze stavu, například odebrání páru klíč-hodnota ze seznamu hodnot událostí nebo odečtení hodnoty ze stavu agregace součtu. Následuje javascriptová šablona pro agregace 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 – Deklarace funkce JavaScriptu

Každá javascriptová UDA je definována deklarací objektu function. Následuje hlavní prvky v definici UDA.

Alias funkce

Alias funkce je identifikátor UDA. Při zavolání v dotazu Stream Analytics vždy používejte alias UDA společně s předponou "uda".

Typ funkce

Pro UDA by měl být typ funkce JavaScript UDA.

Typ výstupu

Konkrétní typ, který úloha Stream Analytics podporuje, nebo Jakýkoli, pokud chcete zpracovat typ v dotazu.

Název funkce

Název tohoto objektu funkce. Název funkce by měl odpovídat aliasu UDA.

Metoda – init()

Init() metoda inicializuje stav agregace. Tato metoda se volá při spuštění okna.

Metoda – kumulovat()

Metoda kumuluje stav UDA na základě předchozího stavu a aktuálních hodnot událostí. Tato metoda se volá, když událost vstoupí do časového intervalu (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW nebo SESSIONWINDOW).

Metoda – deaccumulate()

Metoda deaccumulate() přepočítá stav na základě předchozího stavu a aktuálních hodnot událostí. Tato metoda je volána, když událost opustí SLIDINGWINDOW nebo SESSIONWINDOW.

Metoda – deaccumulateState()

Metoda deaccumulateState() přepočítá stav na základě předchozího stavu a stavu segmentu směrování. Tato metoda se volá, když sada událostí opustí HOPPINGWINDOW.

Metoda – computeResult()

Metoda computeResult() vrátí agregovaný výsledek na základě aktuálního stavu. Tato metoda se volá na konci časového intervalu (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW nebo SESSIONWINDOW).

Podpora vstupních a výstupních datových typů UDA v JavaScriptu

Datové typy UDA JavaScriptu najdete v části Stream Analytics a převodu typů JavaScriptu pro integraci uživatelem definovaných funkcí JavaScriptu.

Přidání UDA JavaScriptu z webu Azure Portal

Níže si projdeme proces vytvoření UDA z portálu. Příklad, který zde používáme, je výpočet průměrů vážených podle času.

Teď pomocí následujících kroků vytvoříme UDA JavaScriptu v existující úloze ASA.

  1. Přihlaste se k webu Azure Portal a vyhledejte existující úlohu Stream Analytics.

  2. Potom vyberte propojení funkcí v části TOPOLOGIE ÚLOHY.

  3. Pokud chcete přidat novou funkci, vyberte Přidat .

  4. V zobrazení Nová funkce vyberte jako typ funkce JavaScript UDA a pak se v editoru zobrazí výchozí šablona UDA.

  5. Jako alias UDA vyplňte "TWA" a změňte implementaci funkce následujícím způsobem:

    // 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. Jakmile vyberete tlačítko Uložit, vaše UDA se zobrazí v seznamu funkcí.

  7. Vyberte novou funkci TWA, můžete zkontrolovat definici funkce.

Volání UDA JavaScriptu v dotazu ASA

Na webu Azure Portal a otevřete úlohu, upravte dotaz a volejte funkci TWA() s předponou mandátu "uda". Příklad:

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)

Testování dotazu s využitím UDA

Vytvořte místní soubor JSON s následujícím obsahem, nahrajte soubor do úlohy Stream Analytics a otestujte výše uvedený dotaz.

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

Získání pomoci

Pokud potřebujete další pomoc, vyzkoušejte naši stránku pro otázky MicrosoftU pro Azure Stream Analytics.

Další kroky