Skip to Content
Dashboard IoTAggregazione e Downsampling

Aggregazione e Downsampling

Per impostazione predefinita un widget riceve righe non elaborate: ogni record che corrisponde ai suoi filtri, dal più recente, fino al limite di righe. È esattamente ciò che serve per una tabella delle ultime letture, ed esattamente ciò che non serve per un grafico degli ultimi sei mesi — un sensore che campiona ogni secondo produce 15 milioni di righe in quella finestra, di cui un grafico largo 600 pixel può disegnarne forse 600.

L’aggregazione risolve entrambi i problemi in un colpo solo. Il database del progetto raggruppa i record corrispondenti in bucket temporali, calcola un valore per ogni bucket e invia al widget soltanto quei valori. Un anno di dati diventa qualche centinaio di punti, e domande a cui i dati grezzi non sanno rispondere — temperatura media per ora, record per macchina, energia totale di oggi — diventano normale configurazione del widget.

Tutto avviene nel database, prima che i dati raggiungano il browser. Nel widget non viene calcolato nulla, così i widget aggregati restano live e restano rapidi indipendentemente da quanta cronologia hanno alle spalle.

Come attivarla

L’aggregazione si trova nella stessa finestra di dialogo dei filtri — quella che si apre dall’icona filtro accanto a un’associazione dati. Vedi Associazione Dati per la finestra nel suo insieme.

Al suo interno, la sezione Aggregazione offre due scelte:

  • Righe non elaborate — l’impostazione predefinita: i record vengono restituiti così come sono memorizzati.
  • Aggregato nel tempo — i record vengono raggruppati e ridotti a un valore per gruppo.
Sezione Aggregazione della finestra dei filtri con la scelta Righe non elaborate / Aggregato nel tempo, il metodo Media, la dimensione dell'intervallo automatica o fissa e le colonne aggregate derivate

Passando ad Aggregato nel tempo compaiono un selettore Metodo e, dove applicabile, i controlli sulla dimensione dei bucket descritti più avanti. Poiché ogni aggregato ha bisogno di un intervallo di tempo su cui operare, attivare l’aggregazione imposta anche una finestra mobile predefinita sulle ultime 24 ore se il widget non aveva ancora una finestra temporale — puoi regolarla nella sezione Finestra temporale mobile subito sopra.

Metodi

MetodoRisultato per bucketApplicabile a
MediaMedia aritmetica dei valoriColonne numeriche
SommaTotale dei valoriColonne numeriche
ConteggioNumero di record con un valoreQualsiasi colonna
MinimoValore più piccoloColonne numeriche, di testo e timestamp
MassimoValore più grandeLe stesse di cui sopra
Primo valoreValore del record più vecchio nel bucketQualsiasi colonna
Ultimo valoreValore del record più recente nel bucketQualsiasi colonna

Un solo metodo si applica a tutte le colonne di valore di una singola serie di dati. Per mostrare più statistiche della stessa misura — ad esempio una banda minimo/massimo con una linea di media — aggiungi una serie di dati per ogni statistica. Condividono un’unica query al database, quindi le serie aggiuntive non costano richieste in più.

Media, Somma, Minimo e Massimo richiedono una colonna che contenga numeri. Puntarli a una colonna di testo o booleana viene rifiutato con un messaggio esplicativo. Conteggio funziona su qualsiasi cosa, il che ne fa il metodo per le domande del tipo “quanti record”.

Che cosa viene aggregato

Non elenchi mai esplicitamente le colonne da aggregare — la piattaforma le deriva dalla mappatura dei campi che hai già configurato per il widget:

Ruolo del campoSignificato sotto aggregazione
x = tspIl grafico ha un asse temporale: i bucket suddividono la finestra temporale.
x = qualsiasi altra colonnaIl grafico ha un asse categoriale: quella colonna raggruppa i record.
pivotDivide il risultato in una serie per ogni valore distinto, aggregata separatamente.
y, r e gli altri campi di valoreAggregati con il metodo selezionato.

Questo significa che la stessa mappatura che usi per le righe non elaborate continua a funzionare: mappa x sul timestamp e y su temperature, attiva l’aggregazione e il grafico traccia la temperatura media per bucket invece di ogni singola lettura.

Le tre forme di un widget aggregato

1. Serie temporale con risoluzione automatica

Il caso più comune: x è mappato su tsp e la modalità dei bucket resta su Automatico — adattato alla risoluzione del widget. La piattaforma sceglie allora la dimensione dei bucket in base alla larghezza con cui il widget viene renderizzato — un grafico largo 600 pixel non riceve mai più di circa 600 punti, qualunque sia la finestra temporale. Allarga la finestra da un giorno a un anno e i bucket diventano semplicemente più ampi; la quantità di dati che attraversa la rete resta costante.

Scegli questa modalità quando la dimensione del bucket non ha un significato proprio e vuoi solo un grafico di tendenza leggibile e veloce: “temperatura nell’ultimo mese”.

Ridimensionare un widget provoca un nuovo caricamento alla nuova risoluzione, ma solo quando la larghezza supera una soglia — i piccoli trascinamenti non generano richieste.

2. Serie temporale con dimensione fissa dei bucket

Seleziona Dimensione fissa dell’intervallo e indica una durata e un’unità — ogni 1 ora, ogni 15 minuti, ogni 6 ore. Usala ogni volta che l’intervallo fa parte della domanda invece di essere un dettaglio di visualizzazione: “pezzi prodotti all’ora”, “energia consumata al giorno”.

I bucket fissi sono allineati a confini naturali nel fuso orario del tuo browser: i bucket da 6 ore iniziano alle 00:00, 06:00, 12:00 e 18:00 ora locale; quelli giornalieri si interrompono alla mezzanotte locale; quelli settimanali iniziano il lunedì.

Se la dimensione scelta producesse più bucket di quanti un grafico possa ragionevolmente mostrare (il tetto è 2000), la piattaforma allarga automaticamente i bucket a un multiplo di quanto richiesto — bucket da un minuto su una settimana intera diventano bucket da cinque minuti — invece di rifiutare la query. La finestra di dialogo ti avvisa quando succede e indica quale dimensione viene effettivamente usata.

3. Un valore per categoria

Mappa x su una colonna invece che sul timestamp — un nome di macchina, un tipo di prodotto, un sito — e il widget diventa un riepilogo per categoria: l’intera finestra temporale viene trattata come un unico bucket e ogni valore distinto di quella colonna produce esattamente una riga aggregata.

Questa è la forma adatta a “record per macchina oggi” o “tempo ciclo medio per linea di produzione questa settimana”. Non c’è alcuna dimensione dei bucket da scegliere — la finestra di dialogo lo indica invece di mostrare i controlli sull’intervallo.

Contare i record: il numero di righe di un gruppo è Conteggio applicato alla colonna timestamp tsp, dato che ogni record ne ha una. Mappa y su tsp e la piattaforma seleziona automaticamente Conteggio — è l’unico aggregato consentito da una colonna timestamp.

x → machine_name (raggruppa i record) y → tsp (conteggiato → numero di record) Metodo: Conteggio Finestra: ultimo 1 giorno

Il risultato è una barra per macchina che mostra quanti record quella macchina ha prodotto nell’ultimo giorno.

Valori singoli aggregati

Le associazioni scalari — il valore di un riquadro KPI, di un gauge, di un campo di testo — offrono la stessa scelta in una sezione Valore:

  • Ultimo valore — il valore del record più recente, come prima.
  • Aggregato su una finestra temporale — un unico valore calcolato sull’intera finestra.

Usala per i numeri di sintesi in tempo reale: “pezzi prodotti oggi” (Conteggio su tsp con una finestra di 1 giorno), “temperatura media di questo turno”, “picco di potenza di questo mese”. Nemmeno qui c’è una dimensione dei bucket — la finestra è il bucket. Il valore si aggiorna man mano che arrivano nuovi record, quindi a differenza di un numero incollato nel widget non diventa mai obsoleto.

Filtri, finestre e aggregazione insieme

Le sezioni della finestra di dialogo si applicano nell’ordine in cui sono mostrate, che è anche l’ordine in cui le applica il database:

  1. Finestra temporale mobile / finestra temporale personalizzata — seleziona il periodo.
  2. Filtri — selezionano quali record all’interno di quel periodo partecipano.
  3. Aggregazione — riduce i record selezionati a un valore per bucket.
  4. Limite righe — una rete di sicurezza, vedi sotto.

Poiché i filtri agiscono prima dell’aggregazione, restringono ciò che entra in ciascun bucket. machine = 'A' combinato con medie orarie dà la media oraria della macchina A. I filtri collegati a widget filtro o a segmenti di routing funzionano esattamente come per le righe non elaborate, quindi un grafico aggregato segue un menu a tendina o l’URL di una pagina come qualsiasi altro widget.

Anche i widget calendario si combinano: quando l’utente sceglie un intervallo di date, quell’intervallo sostituisce la finestra mobile e l’aggregazione lo segue.

Aggancio della finestra

Quando l’aggregazione è attiva, l’inizio della finestra si aggancia alla griglia dei bucket in modo che i bucket stessi restino fermi con il passare del tempo — senza questo, ogni aggiornamento sposterebbe leggermente tutti i confini dei bucket e l’intero grafico tremolerebbe. La finestra di dialogo lo segnala con “La finestra si sposta in passi di …”, e l’anteprima di inizio/fine risolti mostra sempre l’intervallo effettivamente interrogato.

La fine della finestra non viene mai estesa: una finestra che termina adesso continua a terminare adesso, e una finestra che termina un’ora fa non arriva mai dentro quell’ultima ora.

Il limite righe sotto aggregazione

Il Limite righe resta visibile ma cambia ruolo: il numero di bucket viene derivato dalla dimensione del widget o dall’intervallo fisso che hai impostato, non da questo campo. Si applica solo se un widget deve ripiegare sulle righe non elaborate — ad esempio su un’istanza self-hosted la cui versione della piattaforma precede l’aggregazione. Lasciarlo su un valore sensato mantiene utilizzabile un widget del genere.

Buchi nei dati

Un bucket in cui nessun record ha corrisposto viene omesso dal risultato, non restituito come zero. Per una media questa è la risposta onesta — non esiste la media del nulla — ma per un grafico di Conteggio di un evento intermittente significa che un grafico a linee traccia una linea retta attraverso il periodo di silenzio invece di scendere a zero. I grafici a barre mostrano il buco in modo naturale; con i grafici a linee, tieni presente la differenza tra “nessun dato” e “zero”.

Aggiornamenti live

I widget aggregati restano live. Man mano che arrivano i record, i bucket interessati vengono ricalcolati e il widget si aggiorna — al massimo una volta ogni pochi secondi, così un dispositivo che pubblica ad alta frequenza non può sommergere la board. Poiché il bucket più recente di solito si sta ancora riempiendo, il suo valore continua a cambiare finché il bucket non si chiude; è un comportamento atteso ed è il motivo per cui l’ultimo punto di un grafico live è spesso più basso dei vicini con Conteggio e Somma.

Prestazioni e cronologie lunghe

L’aggregazione su una finestra lunga deve comunque leggere i record che stanno dietro. Per le tabelle che alimentano abitualmente grafici su finestre lunghe, un’app può dichiarare il downsampling continuo nel proprio schema dati — vedi downsample nel riferimento del Data Backend. La piattaforma mantiene allora una copia pre-aggregata della tabella e risponde da quella alle query su finestre lunghe, tipicamente con ordini di grandezza in più di velocità, e può conservare quella cronologia sottocampionata più a lungo dei dati grezzi stessi — così un grafico può ancora mostrare due anni di medie orarie dopo che i record grezzi sono stati eliminati.

Tutto questo è completamente trasparente per la board: la configurazione del widget non cambia e le query a cui la copia pre-aggregata non può rispondere (intervalli molto fini, filtri su colonne per cui non raggruppa) ricadono automaticamente sulla tabella grezza.

Limitazioni

  • L’aggregazione si applica alle tabelle, non alle tabelle di trasformazione. Aggrega invece la tabella sottostante, oppure pre-aggrega nell’SQL della trasformazione stessa.
  • Un solo metodo per serie di dati. Usa più serie di dati per più statistiche di una stessa colonna.
  • I timestamp si aggregano solo con Conteggio. La Media di un timestamp non è significativa e viene rifiutata.
  • Un asse categoriale e un asse temporale si escludono a vicenda per una stessa serie di dati — un grafico è o “nel tempo” o “per categoria”. Per ottenere entrambi (medie orarie per macchina), tieni x su tsp e metti la colonna della macchina in pivot.
  • I campi JSON possono essere aggregati come colonne normali, ma solo i campi che l’app ha dichiarato per il downsampling beneficiano della copia pre-aggregata; gli altri vengono calcolati dalla tabella grezza.

Ricette

Cosa vuoixyMetodoIntervallo
Andamento della temperatura su un mesetsptemperatureMediaAutomatico
Pezzi prodotti all’oratsptspConteggioFisso, 1 ora
Energia consumata al giornotspkwhSommaFisso, 1 giorno
Picco di potenza all’ora, per macchinatsppower (+ pivot machine)MassimoFisso, 1 ora
Record per macchina oggimachinetspConteggio— (categoria)
Tempo ciclo medio per linea questa settimanalinecycle_timeMedia— (categoria)
Pezzi prodotti oggi (riquadro KPI)tspConteggio— (valore singolo)
  • Porta un’associazione da Righe non elaborate ad Aggregato nel tempo nella finestra di dialogo dei filtri per far calcolare i valori al database invece di trasferire i record.
  • Con x sul timestamp ottieni una serie temporale — risoluzione automatica per le tendenze, intervallo fisso quando è l’intervallo stesso la domanda.
  • Con x su un’altra colonna ottieni un valore per categoria; con un’associazione scalare ottieni un unico numero live.
  • Il Conteggio sulla colonna tsp è il modo per contare i record.
  • I filtri si applicano prima dell’aggregazione; i bucket vuoti vengono omessi; il limite righe diventa una salvaguardia di riserva.
  • Per le cronologie lunghe, le app possono dichiarare downsample affinché la piattaforma serva i grafici da una copia pre-aggregata e possa conservare quella cronologia oltre la finestra di conservazione dei dati grezzi.
Last updated on