Riferimento alle espressioni per flussi di dati e grafici di flusso di dati

Questo riferimento si applica sia ai flussi di dati che ai grafici del flusso di dati. Entrambi usano lo stesso linguaggio delle espressioni per le trasformazioni di mapping, filtro e arricchimento. I grafici del flusso di dati supportano anche trasformazioni di rami e finestre (accumulo), indicate se applicabile.

Variabili posizionale

La matrice di inputs ogni regola determina le variabili disponibili in expression. Il primo input diventa $1, il secondo diventa $2e così via.

Ingressi dati Expression Result
Position, Office $1 + ", " + $2 Concatena Posizione e Office con una virgola
temperature cToF($1) Converte Celsius in Fahrenheit
temperature, humidity $1 * $2 < 100000 Controlla una soglia rispetto a due campi

Se viene specificato un solo input e non viene specificata alcuna espressione, il valore in corrispondenza dell'input viene copiato direttamente nell'output.

Operatori

Le espressioni supportano gli operatori seguenti, elencati dalla precedenza più alta alla più bassa:

Precedenza Operatori Descrizione
1 ! NOT logico (unario)
2 ^ Elevamento a potenza
3 *, /, % Moltiplicazione, divisione, modulo
4 +, - Addizione/concatenazione di stringhe, sottrazione
5 <, >, <=>= Confronto
6 ==, != Uguaglianza, disuguaglianza
7 && E logico
8 \|\| oppure logico

L'operatore + concatena le stringhe quando almeno un operando è una stringa. Usare le parentesi per eseguire l'override della precedenza predefinita.

Importante

Usa gli operatori && logici simbolici (AND), || (OR) e ! (NOT). La parola chiave forma and, or, e not non è supportata. Ad esempio, scrivere $1 == "a" || $1 == "b" anziché $1 == "a" or $1 == "b".

Esempi:

Expression Descrizione
$1 * 2 ^ 3 Prima l'esponenziazione: $1 * 8
($1 * 2) ^ 3 Override tra parentesi: moltiplicare per primo
-$1 * 2 Negazione prima, quindi moltiplica
$1 > 100 && $2 > 200 Concatenare le condizioni con AND logico

Funzioni predefinite

Funzioni di conversione unità

Queste funzioni accettano un singolo valore numerico e restituiscono un valore float.

Funzione Conversione Formula
cToF(value) Da Celsius a Fahrenheit F = (C × 9/5) + 32
fToC(value) Da Fahrenheit a Celsius C = (F - 32) × 5/9
psiToBar(value) Da PSI a bar barra = PSI × 0,0689476
barToPsi(value) Da bar a PSI PSI = bar / 0,0689476
inToCm(value) Pollici a centimetri cm = in × 2,54
cmToIn(value) Centimetri a pollici in = cm / 2,54
ftToM(value) Piedi a metri m = ft × 0,3048
mToFt(value) Metri a piedi ft = m / 0,3048
lbToKg(value) Sterline a chilogrammi kg = lb × 0,453592
kgToLb(value) Chilogrammi a chili lb = kg / 0,453592
galToL(value) Galloni statunitensi a litri L = gal × 3,78541
lToGal(value) Litri a galloni statunitensi gal = L / 3,78541

Funzioni di ridimensionamento e arrotondamento

Funzione Descrizione
scale(value, srcLo, srcHi, dstLo, dstHi) Scala value in modo lineare dall'intervallo di origine all'intervallo di destinazione. Tutti e cinque gli argomenti devono essere numerici.
round_n(value, decimals) Arrotonda un oggetto float al numero specificato di posizioni decimali (da 0 a 15).

Funzioni matematiche

Queste funzioni provengono dalla libreria matematica predefinita.

Funzione Descrizione
floor(value) Intero più grande minore o uguale a un numero
round(value) Numero intero più vicino, arrotondamento a metà strada da 0,0
ceil(value) Intero più piccolo maggiore o uguale a un numero
math::abs(value) Valore assoluto
math::sqrt(value) Radice quadrata (restituisce NaN per numeri negativi)
math::cbrt(value) Radice cubo
math::ln(value) Logaritmo naturale
math::log2(value) Logaritmo di base 2
math::log10(value) Logaritmo di base 10
math::log(value, base) Logaritmo con base arbitraria
math::exp(value) e elevato alla potenza del valore
math::exp2(value) 2 elevato alla potenza del valore
math::pow(base, exp) Alza la base alla potenza di exp
math::cos(value) Coseno (radianti)
math::sin(value) Seno (radianti)
math::tan(value) Tangente (radianti)
math::acos(value) Arccosine (restituisce radianti)
math::asin(value) Arcsine (restituisce radianti)
math::atan(value) Arctangent (restituisce radianti)
math::atan2(y, x) Arcotangente a quattro quadranti (restituisce radianti)
math::hypot(a, b) Lunghezza dell'ipotenusa dai lati a e b

Funzioni stringa

Funzione Descrizione
len(string) Lunghezza del carattere di una stringa o numero di elementi di una tupla
str::to_lowercase(string) Converte in minuscolo
str::to_uppercase(string) Converte in maiuscolo
str::trim(string) Rimuove gli spazi vuoti iniziali e finali
str::from(value) Converte un valore nella relativa rappresentazione di stringa
str::substring(string, start, end) Estrae una sottostringa per indice di caratteri
str::regex_matches(string, pattern) Restituisce true se la stringa corrisponde al modello regex. Disponibile solo nei grafici del flusso di dati.
str::regex_replace(string, pattern, replacement) Sostituisce tutte le corrispondenze regex con la stringa di sostituzione. Disponibile solo nei grafici del flusso di dati.

Funzioni di data e ora

Le funzioni data e ora sono disponibili solo nei grafici di flusso dei dati. Ad eccezione di parse_timestamp, le funzioni che accettano un timestamp richiedono una stringa RFC 3339 . La stringa deve includere uno spostamento esplicito rispetto al Tempo Universale Coordinato (UTC), come 2026-06-17T12:00:00Z o 2026-06-17T12:00:00-08:00. La Returns colonna elenca il tipo di risultato concettuale, che typeof riporta in minuscola come "float", "int", o "string".

Funzione Restituzioni Descrizione
duration_between(start, end, unit) float Calcola end - start con precisione di millisecondi. Le unità supportate sono "seconds", "millis", "minutes", "hours", e "days". Differenze di ritorno 0inferiori a un millisecondo . Il risultato è negativo quando end è almeno un millisecondo prima startdi .
day_of_week(timestamp) int Restituisce il giorno della settimana, dove è 0 domenica e sabato 6è .
hour_of_day(timestamp) int Restituisce l'ora da 0 fino a 23.
year_of(timestamp) int Restituisce l'anno solare.
month_of(timestamp) int Restituisce il mese da 1 fino a 12.
day_of_month(timestamp) int Restituisce il giorno del mese da 1 fino a 31.
minute_of_hour(timestamp) int Restituisce il minuto da 0 attraverso 59.
second_of_minute(timestamp) int Restituisce il secondo da 0 tramite 59.
timezone_offset(timestamp) int Restituisce lo spostamento dell'orario UTC in pochi minuti. Ad esempio, -08:00 ritorna -480 e +05:30 ritorna 330.
now() string Restituisce l'ora UTC attuale come un timbro RFC 3339 con precisione di millisecondi.
format_timestamp(timestamp, pattern) string Formatta un timestamp RFC 3339 utilizzando un strftime pattern.
parse_timestamp(value, pattern) string Analizza un valore usando un strftime pattern e restituisce un timestamp RFC 3339 UTC con precisione millisecondaria.
from_epoch(value, unit) string Converte un valore dell'epoca Unix in un timestamp RFC 3339 UTC con precisione millisecondaria. Le unità supportate sono "seconds", "millis", e "micros". Il valore può essere un int o float.
to_epoch(timestamp, unit) int Converte un timestamp RFC 3339 in un intero epoch Unix. Le unità supportate sono "seconds", "millis", e "micros".

now() legge l'orologio di sistema del nodo Kubernetes che ospita il carico di lavoro del flusso dati ogni volta che la funzione viene eseguita. Le chiamate nella stessa espressione possono restituire valori diversi. In una regola di accumulo, now() restituisce il momento in cui la finestra viene elaborata, non quando arriva un messaggio di input. Per ridurre lo sfasamento di clock tra i nodi del cluster, sincronizza ogni clock di ogni nodo con una sorgente di tempo affidabile, come un server Network Time Protocol.

Le funzioni di calendario e orologio, come day_of_week, hour_of_day, e year_of, utilizzano lo offset nel timestamp di input. Non convertono prima il valore in UTC. Gli esempi seguenti mostrano questo comportamento.

Expression Result
hour_of_day("2026-06-17T23:30:45-08:00") 23
day_of_week("2026-06-17T23:30:45-08:00") 3 (Mercoledì)
timezone_offset("2026-06-17T23:30:45-08:00") -480
duration_between("2026-06-09T12:00:00Z", "2026-06-09T14:30:00Z", "hours") 2.5

Formato e timestamp di analisi

Le format_timestamp funzioni e parse_timestamp usano strftime schemi. La tabella seguente elenca gli specificatori comuni.

Identificatore Value
%Y Anno a quattro cifre
%m Mese a due cifre
%d Giorno del mese a due cifre
%H Ora in formato 24 ore
%M Minuto
%S Second
%f Nanosecondi dall'ultimo secondo intero, senza punto decimale
%.f Secondi frazionari, incluso il punto decimale
%z Offset numerico UTC, come +0200
%:z Offset numerico UTC con due punti, come +02:00

Per tutti gli specificatori supportati, consulta la documentazione Chrono strftime.

format_timestamp conserva lo offset temporale dell'ingresso. Ad esempio format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") restituisce "2026-06-09 14:00 +02:00".

parse_timestamp gestisce gli input nel seguente ordine:

  1. Una data e un orario con un offset numerico. La funzione rispetta lo offset e normalizza il risultato su UTC.
  2. Una data e un orario senza spostamento. La funzione presuppone UTC.
  3. Un appuntamento senza orario. La funzione presume mezzanotte UTC.

I seguenti esempi mostrano come parse_timestamp gestisce ogni tipo di input.

Expression Result
parse_timestamp("2026-06-17 12:00:00 +0200", "%Y-%m-%d %H:%M:%S %z") "2026-06-17T10:00:00.000Z"
parse_timestamp("2026-06-17 12:00:00", "%Y-%m-%d %H:%M:%S") "2026-06-17T12:00:00.000Z"
parse_timestamp("2026-06-17", "%Y-%m-%d") "2026-06-17T00:00:00.000Z"

Importante

parse_timestamp non supporta valori solo temporali o abbreviazioni di fuso orario come PST. Usa %z o %:z con un offset numerico invece di %Z. L'analisi normalizza i timestamp su UTC, ma la formattazione conserva lo offset di input. Pertanto, le due funzioni non sono inversi esatti per valori che includono uno offset non nullo.

Converti i valori dell'epoca Unix

Usare from_epoch e to_epoch per convertire tra valori epoche Unix e timestamp RFC 3339.

Expression Result
from_epoch(1781568000, "seconds") "2026-06-16T00:00:00.000Z"
from_epoch(1781568000.5, "seconds") "2026-06-16T00:00:00.500Z"
to_epoch("2026-06-16T00:00:00.123Z", "millis") 1781568000123

from_epoch accetta valori negativi per le date precedenti al 1° gennaio 1970. Il suo output ha precisione millisecondaria, quindi convertire microsecondi epoche in un timestamp scarta la precisione inferiore a un millisecondo. to_epoch tiene conto dello spostamento UTC del timestamp e arrotonda i valori precedenti al 1970 fino all'intero inferiore successivo per l'unità selezionata.

Possono essere composte funzioni di data e ora. Ad esempio, duration_between($1, now(), "days") calcola l'età in giorni di un timestamp RFC 3339 fornito come primo input di regola. Per leggere l'ora di un timestamp dopo averlo convertito in UTC, usa hour_of_day(from_epoch(to_epoch($1, "micros"), "micros")).

Funzioni condizionali e di raccolta

Funzione Descrizione
if(condition, trueVal, falseVal) Restituisce trueVal quando la condizione è true; in caso contrario, falseVal
min(values) Minimo di uno o più valori numerici o di una matrice
max(values) Massimo di uno o più valori numerici o di una matrice
contains(tuple, value) Restituisce true se la tupla contiene il valore
contains_any(tuple, candidates) Restituisce true se la tupla contiene qualsiasi valore della tupla candidati
typeof(value) Restituisce il tipo come stringa: "string", "float", "int", "boolean", "tuple"o "empty"

Funzioni di aggregazione (solo trasformazioni di finestra)

Queste funzioni sono disponibili solo nelle regole di accumulo all'interno delle trasformazioni di finestra. Ognuno accetta una singola variabile posizionale.

Funzione Restituzioni Comportamento della finestra vuota
average($n) Media dei valori numerici Error
sum($n) Somma dei valori numerici 0.0
min($n) Valore numerico minimo Error
max($n) Valore numerico massimo Error
count($n) Numero di messaggi in cui esiste il campo 0
first($n) Primo valore nella finestra Error
last($n) Ultimo valore nella finestra Error

Per informazioni dettagliate sull'uso delle funzioni di aggregazione, vedere Aggregare i dati nel tempo.

Logica condizionale

Usare la funzione per diramare la if logica all'interno di un'espressione:

Expression Descrizione
if($1 > 100, "high", "normal") Restituisce "alto" quando la temperatura supera 100
if($2 == (), $1, $1 * $2) Torna a $1 quando manca $2
if($1 > 5, true, false) Restituisce un valore booleano basato su una soglia

Usare () (il valore vuoto) nei confronti per rilevare i campi mancanti.

Suggerimento

Se è necessario solo un fallback statico per un campo mancante, la ?? <default> sintassi è più semplice. Vedere Valori predefiniti. Riservare if per i casi in cui è necessario scegliere tra i valori calcolati.

Campi dei metadati

Leggere e scrivere nei metadati dei messaggi usando il $metadata. prefisso nei inputs campi o output di una regola. I riferimenti ai metadati vengono inseriti nel percorso del campo, non nell'espressione stessa.

Proprietà dei metadati

  • Argomento: funziona sia per MQTT che per Kafka. Contiene la stringa in cui è stato pubblicato il messaggio. Esempio: $metadata.topic.
  • Proprietà utente: in MQTT, si riferisce alle coppie chiave/valore in formato libero che un messaggio MQTT può contenere. Ad esempio, se il messaggio MQTT è stato pubblicato con una proprietà utente con la chiave "priority" e il valore "high", il $metadata.user_property.priority riferimento contiene il valore "high". Le chiavi delle proprietà utente possono essere stringhe arbitrarie e possono richiedere l'uso di caratteri di escape: $metadata.user_property."weird key" utilizza la chiave "chiave strana" (che contiene uno spazio).
  • Proprietà di sistema: questo termine viene usato per ogni proprietà che non è una proprietà utente. Attualmente è supportata solo una singola proprietà di sistema: $metadata.system_property.content_type, che legge la proprietà del tipo di contenuto del messaggio MQTT (se impostata).
  • Intestazione: Questa è l'equivalente Kafka della proprietà utente MQTT. Kafka può usare qualsiasi valore binario per una chiave, ma i flussi di dati supportano solo chiavi stringa UTF-8. Esempio: $metadata.header.priority. Questa funzionalità è simile alle proprietà utente.
Campo Descrizione
$metadata.topic Argomento MQTT del messaggio
$metadata.user_property.<key> Proprietà utente nel messaggio, identificata dalla chiave
$metadata.system_property.content_type Proprietà di sistema del tipo di contenuto
$metadata.header.<key> Valore dell'intestazione Kafka, identificato dalla chiave

Leggere dai metadati

Per fare riferimento all'argomento di origine e a una proprietà utente in un'espressione, elencarli come input:

Inserimento Variabile
$metadata.topic $1
$metadata.user_property.device_id $2

Espressione: $1 + "/" + $2

Nell'esempio seguente, la proprietà MQTT topic è mappata nel campo origin_topic nell'output.

Inserimento Risultato
$metadata.topic origin_topic

Se la proprietà priority utente è presente nel messaggio MQTT, l'esempio seguente illustra come eseguirne il mapping a un campo di output:

Inserimento Risultato
$metadata.user_property.priority priority

Scrivere nei metadati

Per impostare una proprietà utente nel messaggio di output, usare $metadata.user_property.<key> come campo di output.

L'impostazione di un campo di metadati su un valore vuoto (()) lo rimuove. Per le proprietà utente, sono consentite chiavi duplicate.

È anche possibile eseguire il mapping delle proprietà dei metadati a un'intestazione di output o a una proprietà utente. Nell'esempio seguente, il MQTT topic è mappato al campo origin_topic nella proprietà utente dell'output.

Inserimento Risultato
$metadata.topic $metadata.user_property.origin_topic

Se il payload in ingresso contiene un priority campo, l'esempio seguente illustra come eseguirne il mapping a una proprietà utente MQTT:

Inserimento Risultato
priority $metadata.user_property.priority

Lo stesso esempio per Kafka:

Inserimento Risultato
priority $metadata.header.priority

I campi dei metadati sono supportati nelle regole di mapping, filtro e ramo. Non sono disponibili nelle regole di finestra (accumulo).

Ultimo valore noto

Usare il ? $last suffisso su un input per indicare al runtime di ricordare il valore più recente per tale campo. Se il campo non è presente nel messaggio corrente, viene invece utilizzato l'ultimo valore noto.

Inserimento Comportamento
temperature ? $last Usa l'ultima temperatura nota se il messaggio corrente non ha alcun temperature campo

La ? $last direttiva non fa distinzione tra maiuscole e minuscole e supporta spazi vuoti flessibili.

Importante

Gli ultimi valori noti vengono archiviati solo in memoria. Vengono persi quando il pod viene riavviato e non vengono condivisi tra le repliche.

L'ultimo valore noto è supportato nelle regole di mapping, filtro e ramo. Non è disponibile nelle regole di finestra (accumulo).

Valori predefiniti

Usare il ?? <default> suffisso su un input per fornire un valore di fallback quando il campo non è presente. Tipi predefiniti supportati: integer, float, boolean, string e null.

Annotazioni

La ?? <default> sintassi è disponibile solo nei grafici del flusso di dati. Non è supportata negli input del flusso builtInTransformation di dati.

Inserimento Risoluzione alternativa
temperature ?? 0 Intero 0
status ?? "unknown" Stringa "unknown"
threshold ?? 98.6 Float 98.6
enabled ?? true Valore booleano true

Combinare l'ultimo valore noto e il valore predefinito

È possibile combinare ? $last e ?? <default>. Il runtime controlla prima il messaggio corrente, quindi l'ultimo valore noto, quindi il valore predefinito. Se si usa ?? <default> senza ? $last, il runtime controlla direttamente il messaggio corrente e quindi il valore predefinito.

Inserimento Ordine di valutazione
temperature ?? 0 Valore corrente, quindi predefinito (0)
temperature ? $last ?? 0 Valore corrente, quindi ultimo noto, quindi predefinito (0)

I valori predefiniti sono supportati nelle regole di mapping, filtro e ramo. Non sono disponibili nelle regole di finestra (accumulo).

Tipi di dati

Tipo Descrizione Esempio
Intero Intero con segno a 64 bit 42, -7
Galleggiare Virgola mobile a 64 bit 3.14, -0.5
Stringa Testo UTF-8 "hello"
Bool Booleano true, false
Tupla Matrice di valori primitivi (1, 2, 3)
Vuoto Valore mancante o Null ()
JSON Oggetto JSON passato tramite (non può essere usato nelle espressioni)

Gli oggetti JSON e le matrici vengono mantenuti as-is quando i campi vengono copiati senza un'espressione, ma non possono essere usati come input per la valutazione delle espressioni.

Supporto delle funzionalità per tipo di trasformazione

Lo stesso linguaggio delle espressioni funziona tra trasformazioni, ma il risultato di un'espressione significa qualcosa di diverso in ciascuna:

Trasformazione Cosa fa l'espressione risultato
Mappa Produce il valore scritto in output
Filter Quando è vero, il messaggio viene eliminato. Per mantenere i messaggi corrispondenti, inverti l'espressione.
Branch Instrada il messaggio al true percorso op false . Non viene eliminato nulla.
Finestra (accumulo) Produce il valore aggregato per la finestra
Feature Mappa Filter Branch Finestra (accumulo)
Variabili posizionale
Operatori
Funzioni predefinite
Funzione di aggregazione No No No
$metadata Accesso No
$context Arricchimento No
? $last No
?? <default> ¹ No
str::regex_matches / str::regex_replace ¹ No
Caratteri jolly No No No

¹ Disponibile solo nei grafici del flusso di dati. Non supportato negli input del flusso builtInTransformation di dati.

Notazione e escape dei punti

La notazione punto viene ampiamente usata per fare riferimento a campi annidati. Un percorso di notazione punto standard è simile a Person.Address.Street.Number.

In un flusso di dati, un percorso descritto dalla notazione punto può includere stringhe e alcuni caratteri speciali senza dover eseguire l'escape, ad esempio Person.Date of Birth.

In altri casi, l'escape è necessario, ad esempio: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Questo percorso, tra gli altri caratteri speciali, contiene punti all'interno del nome del campo. Senza escape, il nome del campo fungerebbe da separatore nella notazione del punto stesso.

Mentre un flusso di dati analizza un percorso, tratta solo due caratteri come speciali:

  • I punti (.) fungono da separatori di campo.
  • Le doppie virgolette, quando poste all'inizio o alla fine di un segmento, iniziano una sezione sfuggita dove i punti non sono trattati come separatori di campo.

Tutti gli altri caratteri vengono considerati come parte del nome del campo. Questa flessibilità è utile in formati come JSON, in cui i nomi dei campi possono essere stringhe arbitrarie.

La definizione del percorso deve inoltre rispettare le regole del formato di configurazione. Quando un carattere con un significato speciale viene incluso nel percorso, è necessario inserire le virgolette appropriate. Ad esempio, i nomi di campo che iniziano con due punti (ad :Person:.:name:esempio ) o che iniziano con un numero seguito da testo (ad 100 celsius.hotesempio ) devono essere interpretati correttamente come stringhe.

Evasione

La funzione primaria di escape in un percorso con notazione punto consiste nell'usare punti che fanno parte dei nomi dei campi anziché dei separatori. Ad esempio, il percorso Payload."Tag.10".Value è costituito da tre segmenti: Payload, Tag.10e Value. Le virgolette doppie impediscono Tag.10 al punto di fungere da separatore.

Regole di escape nella notazione con punti

  • Esegui l'escape di ciascun segmento separatamente: nel caso in cui più segmenti contengano punti, tali segmenti devono essere racchiusi tra virgolette doppie. Anche altri segmenti possono essere racchiusi tra virgolette, ma non influisce sull'interpretazione del percorso. Ad esempio: Payload."Tag.10".Measurements."Vibration.$12".Value

  • Cita un segmento solo quando deve essere liberato. Aggiungi virgolette doppie intorno a un segmento solo quando contiene un punto (o un altro carattere che altrimenti verrebbe interpretato erroneamente come separatore). Non citare un nome di campo qualunque.

    Ad esempio, per un campo chiamato TagName all'interno Recordsdi :

    Fai questo Non questo
    Records.TagName Records."TagName"

    Le virgolette extra non aiutano e, in alcuni strumenti, come l'editor di flusso dati dell'esperienza operativa, diventano parte del nome del campo. La mappatura poi cerca un campo chiamato "TagName" (virgolette incluse), che non esiste, quindi nulla corrisponde. Puoi individuarlo nella definizione del flusso dati esportato, dove il nome appare con virgolette sfuggite, come \"TagName\". Per risolverlo, rimuovi le virgolette in modo che il nome sia semplicemente TagName.

  • Uso corretto delle virgolette doppie: le virgolette doppie devono aprire e chiudere un segmento di testo tra virgolette. Tutte le virgolette al centro del segmento vengono considerate parte del nome del campo. Ad esempio, il percorso Payload.He said: "Hello", and waved definisce due campi: Payload e He said: "Hello", and waved. Quando un punto viene visualizzato in queste circostanze, continua a fungere da separatore. Ad esempio, il percorso Payload.He said: "No. It is done" viene suddiviso nei segmenti Payload, He said: "Noe It is done" (a partire da uno spazio).

Algoritmo di segmentazione

  • Se il primo carattere di un segmento è una virgoletta, il parser cerca la virgoletta successiva. La stringa racchiusa tra queste virgolette è considerata un singolo segmento.
  • Se il segmento non inizia con virgolette, il parser identifica i segmenti cercando il punto successivo o la fine del percorso.

Caratteri jolly

Usare un carattere jolly (*) nei percorsi di input e output per trovare una corrispondenza con più campi contemporaneamente. Ciò è utile quando l'output è simile all'input o quando è necessario applicare la stessa trasformazione in molti campi senza elencarne uno.

Importante

Gli esempi di wildcard in questa sezione passano attraverso i campi contenuti dall'input. Per output MQTT, Kafka e altri JSON, va bene. Per una destinazione di archiviazione con serializzazione Parquet o Delta, lo schema di output deve dichiarare ogni foglia a cui il jolly si espande. Se il payload runtime contiene un campo che lo schema non dichiara, il record viene eliminato. Genera lo schema a partire dai dati campioni rappresentativi e vedi Comportamento di serializzazione dello storage.

Copiare tutti i campi

Per passare ogni campo senza modifiche:

Inserimento Risultato
* *

Corrisponde * a ogni percorso di campo nell'input e lo inserisce nello stesso percorso nell'output. La parte del percorso corrispondente * viene chiamata segmento acquisito. Nell'output il segmento acquisito sostituisce .*

Appiattire i campi annidati

Per spostare i campi da un oggetto annidato al livello radice, inserire il prefisso nell'input e * nell'output:

Inserimento Risultato
Sensors.* *
Metadata.* *

Dato questo input:

{
  "Sensors": { "Temperature": 72.5, "Pressure": 14.7 },
  "Metadata": { "LineId": "Line-3", "Shift": "A" }
}

L'output rende flat entrambi gli oggetti:

{
  "Temperature": 72.5,
  "Pressure": 14.7,
  "LineId": "Line-3",
  "Shift": "A"
}

Ristrutturare i campi

Per spostare i campi in un nuovo elemento padre, inserire * l'input e aggiungere un prefisso nell'output:

Inserimento Risultato
* Telemetry.*

In questo modo vengono inclusi tutti i campi di primo livello all'interno di un Telemetry oggetto .

Regole di posizionamento con caratteri jolly

  • È consentito un solo valore* per input o percorso di output.
  • Deve * corrispondere a un segmento completo (non a un segmento parziale come Sensor*).
  • Può * essere visualizzato all'inizio (*.Value), al centro (Sensors.*.Reading) o alla fine (Sensors.*) di un percorso.

Caratteri jolly a più input

Quando una regola ha più input con caratteri jolly, deve * acquisire lo stesso segmento in tutti gli input. Il runtime risolve l'oggetto * dal primo input, quindi cerca i percorsi corrispondenti negli altri input.

Ad esempio, per mediare le letture massime e minime per ogni sensore:

Inserimento Risultato Expression
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2

Dato questo input:

{
  "Temperature": { "Max": 85.3, "Min": 62.1 },
  "Pressure": { "Max": 15.2, "Min": 14.1 }
}

L'oggetto * acquisisce Temperature prima di tutto, quindi la regola cerca sia Temperature.Max che Temperature.Min. Acquisisce Pressure quindi e cerca Pressure.Max e Pressure.Min. L'output è il seguente:

{
  "Averaged": { "Temperature": 73.7, "Pressure": 14.65 }
}

Se un input non può essere risolto per un segmento acquisito(ad esempio, *.Mid.Avg quando il campo è annidato in modo diverso), tale segmento viene ignorato. Assicurarsi che i percorsi in tutti gli input riflettano la struttura effettiva dei dati.

Eseguire l'override di un carattere jolly per campi specifici

È possibile combinare una regola con caratteri jolly con regole specifiche. Le regole specifiche hanno la precedenza quando hanno una copertura inferiore (meno segmenti corrispondono a *). Questa operazione è denominata specializzazione.

Inserimento Risultato Expression
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2
Pressure.Max ($1)
Pressure.Min ($2)
Averaged.PressureAdj ($1 + $2 + 1.0) / 2

La prima regola si applica a tutti i campi. La seconda regola esegue l'override solo per Pressure , perché Pressure.Max è più specifica di *.Max (copertura 0 e copertura 1).

Per escludere completamente un campo, usare un output vuoto:

Inserimento Risultato
Pressure.Max, Pressure.Min (vuoto)

Un output vuoto elimina il campo dal risultato. In questo modo viene eseguito l'override di qualsiasi regola con caratteri jolly che altrimenti lo includerebbe.

Più regole sugli stessi input

Se due regole hanno la stessa copertura o superiore, entrambe si applicano. In questo modo è possibile calcolare più valori derivati dagli stessi input:

Inserimento Risultato Expression
*.Max ($1)
*.Min ($2)
Stats.*.Avg ($1 + $2) / 2
*.Max ($1)
*.Min ($2)
Stats.*.Range $1 - $2

Entrambe le regole vengono eseguite per ogni segmento acquisito, producendo due campi di output per sensore.

Caratteri jolly nei set di dati di contestualizzazione

È possibile usare caratteri jolly con $context riferimenti per copiare tutti i campi da un set di dati:

Inserimento Risultato
$context(assetMeta).* Asset.*

In questo modo ogni campo del assetMeta set di dati viene copiato nella Asset sezione dell'output.

Set di dati di contestualizzazione

I set di dati di contestualizzazione consentono ai mapping di integrare dati aggiuntivi da database esterni. Usare il $context(datasetName) prefisso per fare riferimento ai campi di un set di dati. Ad esempio, $context(position).BaseSalary legge il BaseSalary campo da un set di dati denominato position.

Per informazioni dettagliate sulla configurazione dei set di dati di contestualizzazione, vedere Arricchire i dati usando i flussi di dati e Arricchire i dati esterni nei grafici del flusso di dati.

Se sei arrivato qui cercando la sintassi usata in una trasformata specifica, questi articoli mostrano espressioni nel contesto:

Per farlo Vedi
Rinomina, ristrutturazione o calcolo dei campi, incluse conversioni di unità come cToF Trasformare i dati con la mappa nei grafici del flusso di dati
Lascia i messaggi o instradali su percorsi diversi con una condizione Filtrare e instradare i dati nei grafici del flusso di dati
Calcolare medie, somme o conteggi su una finestra temporale Aggregare i dati nel tempo
Cerca i dati di riferimento dallo store statale Arricchire con dati esterni
Imposta l'argomento MQTT di output dal contenuto del messaggio Indirizzare i messaggi a diversi argomenti
Costruisci la pipeline che contiene queste trasformazioni Dati di processo con grafici di flusso dati

Per i flussi di dati, vedi Mappare i dati usando flussi di dati e Filtrare i dati in un flusso di dati.