Aggregazioni JavaScript definite dall'utente in Analisi di flusso di Azure

Analisi di flusso di Azure supporta le aggregazioni definite dall'utente (UDA) scritte in JavaScript e ciò consente di implementare la logica di business con stato complessa. Le aggregazioni definite dall'utente garantiscono il controllo completo su strutture di dati sullo stato, accumulo di stati, decumulazione di stati e calcolo dei risultati dell'aggregazione. Nell'articolo sono descritte le due diverse interfacce JavaScript per aggregazioni definite dall'utente, le procedure per creare un'aggregazione definita dall'utente e come utilizzare questo tipo di aggregazione con operazioni basate su finestre temporali in query di Analisi di flusso di Azure.

aggregazioni JavaScript definite dall'utente

Un'aggregazione definita dall'utente viene usata su una finestra temporale specifica per aggregare gli eventi in tale finestra e generare un unico valore di risultato. Esistono due tipi di interfacce per l'aggregazione definita dall'utente attualmente supportati in Analisi di flusso di Azure, ovvero AccumulateOnly e AccumulateDeaccumulate. Entrambi i tipi di aggregazione definita dall'utente possono essere usati da Finestra a cascata, di salto, scorrevole e della sessione. L'UDA accumulateDeaccumulate offre prestazioni migliori rispetto a AccumulateOnly UDA quando vengono usate insieme a Hopping, Sliding e Session Window. Scegliere uno dei due tipi in base all'algoritmo usato.

Aggregazioni di tipo AccumulateOnly

Le aggregazioni AccumulateOnly possono accumulare nuovi eventi solo allo stato, l'algoritmo non consente la deaccumulazione dei valori. Scegliere questo tipo di aggregazione quando risulta impossibile implementare la decumulazione delle informazioni di un evento dal valore di stato. Di seguito è illustrato il modello JavaScript per le aggregazioni di tipo 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;
    }
}

Aggregazioni di tipo AccumulateDeaccumulate

Le aggregazioni di tipo AccumulateDeaccumulate consentono la decumulazione di un valore precedentemente accumulato dallo stato, ad esempio la rimozione di una coppia chiave-valore da un elenco di valori di evento o la sottrazione di un valore da uno stato di somma di aggregazioni. Di seguito è illustrato il modello JavaScript per le aggregazioni di tipo 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;
    }
}

Aggregazione definita dall'utente - Dichiarazione della funzione JavaScript

Ogni aggregazione JavaScript definita dall'utente viene definita dalla dichiarazione di un oggetto Function. Di seguito sono descritti i principali elementi di una definizione di aggregazione definita dall'utente.

Alias di funzione

L'alias di funzione rappresenta l'identificatore dell'aggregazione definita dall'utente. Quando viene chiamato nella query di Analisi di flusso, usare sempre l'alias UDA insieme a un prefisso "uda".

Tipo di funzione

Per UDA, il tipo di funzione deve essere JavaScript UDA.

Tipo di output

Tipo specifico supportato dal processo di Analisi di flusso di Azure oppure "Any" se si desidera gestire il tipo nella query.

Nome della funzione

Nome dell'oggetto Function corrente. Il nome della funzione deve corrispondere all'alias dell'aggregazione definita dall'utente.

Metodo init()

Il metodo init() inizializza lo stato dell'aggregazione. Questo metodo viene chiamato all'inizio della finestra temporale.

Metodo accumulate()

Il metodo accumulate() calcola lo stato dell'aggregazione definita dall'utente in base allo stato precedente e ai valori di evento correnti. Questo metodo viene chiamato quando un evento entra in un intervallo di tempo (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW o edizione Standard SSIONWINDOW).

Metodo deaccumulate()

Il metodo deaccumulate() ricalcola lo stato in base allo stato precedente e ai valori di evento correnti. Questo metodo viene chiamato quando un evento abbandona una finestra di tipo SLIDINGWINDOW o SESSIONWINDOW.

Metodo deaccumulateState()

Il metodo deaccumulateState() ricalcola lo stato in base allo stato precedente e allo stato di un hop. Questo metodo viene chiamato quando un set di eventi lascia un oggetto HOPPINGWINDOW.

Metodo computeResult()

Il metodo computeResult() restituisce il risultato dell'aggregazione in base allo stato corrente. Questo metodo viene chiamato alla fine di una finestra temporale (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW o edizione Standard SSIONWINDOW).

Tipi di dati di input e output supportati dall'aggregazione JavaScript definita dall'utente

Per i tipi di dati delle aggregazioni JavaScript definite dall'utente, vedere la sezione Conversione dei tipi di Analisi di flusso di Azure e JavaScript in Integrare funzioni UDF di JavaScript.

Aggiunta di un'aggregazione JavaScript definita dall'utente dal portale di Azure

Di seguito viene descritto il processo di creazione di un'aggregazione definita dall'utente dal portale. L'esempio usato di seguito illustra le medie ponderate in base al tempo.

A questo punto viene creata un'aggregazione JavaScript definita dall'utente in un processo ASA esistente eseguendo i passaggi seguenti.

  1. Accedere a portale di Azure e individuare il processo di Analisi di flusso esistente.

  2. Selezionare quindi il collegamento alle funzioni in TOPOLOGIA PROCESSO.

  3. Selezionare Aggiungi per aggiungere una nuova funzione.

  4. Nella visualizzazione Nuova funzione selezionare JavaScript UDA come tipo di funzione, quindi viene visualizzato un modello UDA predefinito nell'editor.

  5. Immettere "TWA" come alias dell'aggregazione definita dall'utente e modificare l'implementazione della funzione come indicato di seguito:

    // 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. Dopo aver selezionato il pulsante "Salva", l'UDA viene visualizzata nell'elenco delle funzioni.

  7. Selezionare la nuova funzione "TWA", è possibile controllare la definizione della funzione.

Chiamata di un'aggregazione JavaScript definita dall'utente in una query ASA

Nel portale di Azure aprire il processo, modificare la query e chiamare la funzione TWA() con un prefisso obbligatorio "uda". Ad esempio:

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)

Test della query mediante un'aggregazione definita dall'utente

Creare un file JSON locale con il contenuto riportato di seguito, caricare il file nel processo di Analisi di flusso di Azure ed eseguire il test della query illustrata in precedenza.

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

Come ottenere assistenza

Per ulteriore assistenza, provare la Pagina delle domande di Domande e risposte Microsoft per Analisi di flusso di Azure.

Passaggi successivi