Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Azure Stream Analytics supporta le aggregazioni definite dall'utente (UDA) scritte in JavaScript, il che consente di implementare una complessa logica aziendale con stato. All'interno dell'UDA si ha il controllo completo della struttura dei dati di stato, dell'accumulo dello stato, della deaccumulazione dello stato e del calcolo dei risultati aggregati. Nell'articolo sono introdotte le due diverse interfacce UDA in JavaScript, i passaggi per creare un'UDA e come utilizzare l'UDA con operazioni basate su finestre nelle query di Stream Analytics.
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 UDA attualmente supportate da Stream Analytics, 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 è riportato il modello JavaScript per le aggregazioni AccumulateOnly:
// 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 UDA JavaScript è definito da una dichiarazione dell'oggetto Function. Seguono i principali elementi in una definizione UDA.
Alias di funzione
L'alias di funzione è l'identificatore UDA. Quando viene chiamato in una query di Stream Analytics, utilizzare sempre l'alias UDA insieme al 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. Il nome della funzione dovrebbe corrispondere all'alias UDA.
Metodo init()
Il metodo init() inizializza lo stato dell'aggregazione. Questo metodo viene chiamato all'inizio della finestra temporale.
Il metodo accumulate()
Il metodo accumulate() calcola lo stato dell'UDA basato sullo stato precedente e sui valori degli eventi attuali. Questo metodo viene chiamato quando un evento entra in una finestra temporale (TUMBLINGWINDOW, HOPPINGWINDOW, SLIDINGWINDOW o SESSIONWINDOW).
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 SESSIONWINDOW).
Tipi di dati di input e output supportati da JavaScript UDA
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 una UDA dal portale. L'esempio usato di seguito illustra le medie ponderate in base al tempo.
A questo punto, creiamo una JavaScript UDA nel contesto di un processo ASA esistente seguendo i passaggi seguenti.
Accedere al portale di Azure e individuare il processo di Analisi di flusso di Azure esistente.
Selezionare quindi il collegamento alle funzioni sotto TOPOLOGIA DEL LAVORO.
Selezionare Aggiungi per aggiungere una nuova funzione.
Nella visualizzazione Nuova funzione selezionare JavaScript UDA come tipo di funzione, quindi viene visualizzato un modello UDA predefinito nell'editor.
Immettere "TWA" come alias UDA e modificare l'implementazione della funzione come segue:
// 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; } }Dopo aver selezionato il pulsante "Salva", l'UDA viene visualizzata nell'elenco delle funzioni.
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
- Introduzione ad Analisi dei flussi di Azure
- Introduzione all'uso di Analisi dei flussi di Azure
- Ridimensionare i processi di Analisi dei flussi di Azure
- Informazioni di riferimento sul linguaggio di query di Analisi di flusso di Azure
- Informazioni di riferimento sulle API REST di gestione di Analisi di flusso di Azure