Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Diese Referenz gilt sowohl für Datenflüsse als auch für Datenflussdiagramme. Beide verwenden dieselbe Ausdruckssprache für Karten-, Filter- und Anreicherungstransformationen. Datenflussdiagramme unterstützen auch Verzweigungs- und Fenstertransformationen (Akkumulation), die gegebenenfalls angegeben werden.
Positionsvariablen
Jedes Regelarray inputs bestimmt die variablen, die in der expression. Die erste Eingabe wird $1, die zweite wird $2usw.
| Eingänge | Ausdruck | Ergebnis |
|---|---|---|
Position, Office |
$1 + ", " + $2 |
Verketten von Position und Office mit einem Komma |
temperature |
cToF($1) |
Wandelt Celsius in Fahrenheit um. |
temperature, humidity |
$1 * $2 < 100000 |
Überprüft einen Schwellenwert auf zwei Felder. |
Wenn nur eine Eingabe angegeben ist und kein Ausdruck angegeben wird, wird der Wert an dieser Eingabe direkt in die Ausgabe kopiert.
Betriebspersonal
Ausdrücke unterstützen die folgenden Operatoren, die von der höchsten bis zur niedrigsten Rangfolge aufgelistet werden:
| Vorrang | Betriebspersonal | Beschreibung |
|---|---|---|
| 1 | ! |
Logische NOT (unär) |
| 2 | ^ |
Potenzierung |
| 3 |
*, /% |
Multiplikation, Division, Modulo |
| 4 |
+, - |
Addition / Zeichenfolgenverkettung, Subtraktion |
| 5 |
<
>
<=
>=
|
Vergleich |
| 6 |
==, != |
Gleichheit, Ungleichheit |
| 7 | && |
Logisches AND |
| 8 | \|\| |
Logisches OR |
Der + Operator verkettet Zeichenfolgen, wenn mindestens ein Operand eine Zeichenfolge ist. Verwenden Sie Klammern, um die Standardrangfolge außer Kraft zu setzen.
Von Bedeutung
Verwenden Sie die symbolischen logischen Operatoren && (UND), || (ODER) und ! (NICHT). Die Schlüsselwortformen and, or, und not werden nicht unterstützt. Schreiben Sie $1 == "a" || $1 == "b" z. B. anstelle von $1 == "a" or $1 == "b".
Beispiele:
| Ausdruck | Beschreibung |
|---|---|
$1 * 2 ^ 3 |
Exponentiation zuerst: $1 * 8 |
($1 * 2) ^ 3 |
Außerkraftsetzen von Klammern: Multiplizieren zuerst |
-$1 * 2 |
Negation zuerst, dann multiplizieren |
$1 > 100 && $2 > 200 |
Kettenbedingungen mit logischem UND |
Integrierte Funktionen
Einheitenkonvertierungsfunktionen
Diese Funktionen akzeptieren einen einzelnen numerischen Wert und geben einen Float-Wert zurück.
| Funktion | Umwandlung | Formel |
|---|---|---|
cToF(value) |
Celsius zu Fahrenheit | F = (C × 9/5) + 32 |
fToC(value) |
Fahrenheit zu Celsius | C = (F - 32) × 5/9 |
psiToBar(value) |
PSI zu Bar | bar = PSI × 0,0689476 |
barToPsi(value) |
Bar zu PSI | PSI = Bar / 0,0689476 |
inToCm(value) |
Zoll bis Zentimeter | cm = in × 2,54 |
cmToIn(value) |
Zentimeter bis Zoll | in = cm / 2,54 |
ftToM(value) |
Fuß bis Meter | m = ft × 0,3048 |
mToFt(value) |
Meter zu Fuß | ft = m / 0,3048 |
lbToKg(value) |
Pfund bis Kilogramm | kg = lb × 0,453592 |
kgToLb(value) |
Kilogramm bis Pfund | lb = kg / 0,453592 |
galToL(value) |
US-Gallone zu Litern | L = gal × 3,78541 |
lToGal(value) |
Liter bis US-Gallone | gal = L / 3,78541 |
Skalierungs- und Rundungsfunktionen
| Funktion | Beschreibung |
|---|---|
scale(value, srcLo, srcHi, dstLo, dstHi) |
Skaliert value linear vom Quellbereich zum Zielbereich. Alle fünf Argumente müssen numerisch sein. |
round_n(value, decimals) |
Rundet eine Gleitkommazahl auf die angegebene Anzahl von Dezimalstellen (0 bis 15). |
Mathematische Funktionen
Diese Funktionen stammen aus der integrierten mathematischen Bibliothek.
| Funktion | Beschreibung |
|---|---|
floor(value) |
Größte ganze Zahl kleiner oder gleich einer Zahl |
round(value) |
Nächste ganze Zahl, rundet Halbweg-Fälle von 0,0 ab |
ceil(value) |
Kleinste ganze Zahl größer oder gleich einer Zahl |
math::abs(value) |
Absolutwert |
math::sqrt(value) |
Quadratwurzel (gibt NaN für negative Zahlen zurück) |
math::cbrt(value) |
Cubestamm |
math::ln(value) |
Natürlicher Logarithmus |
math::log2(value) |
Logarithmus base-2 |
math::log10(value) |
Logarithmus base-10 |
math::log(value, base) |
Logarithmus mit beliebiger Basis |
math::exp(value) |
e wird auf die Potenz des Werts erhöht. |
math::exp2(value) |
2 erhöht auf die Potenz des Werts |
math::pow(base, exp) |
Wirft die Basis auf die Kraft des Exp |
math::cos(value) |
Kosinus (Bogenmaß) |
math::sin(value) |
Sinus (Bogenmaß) |
math::tan(value) |
Tangens (Bogenmaß) |
math::acos(value) |
Arckosinus (gibt Bogenmaße zurück) |
math::asin(value) |
Arcsinus (gibt Bogenmaße zurück) |
math::atan(value) |
Arkutangent (Gibt Bogenmaße zurück) |
math::atan2(y, x) |
Vier-Quadranten-Arkutangent (Gibt Bogenmaße zurück) |
math::hypot(a, b) |
Länge der Hypotenuse von seiten a und b |
Zeichenfolgenfunktionen
| Funktion | Beschreibung |
|---|---|
len(string) |
Zeichenlänge einer Zeichenfolge oder Elementanzahl eines Tupels |
str::to_lowercase(string) |
Konvertiert in Kleinbuchstaben |
str::to_uppercase(string) |
Konvertiert in Großbuchstaben |
str::trim(string) |
Entfernt führende und nachfolgende Leerzeichen. |
str::from(value) |
Wandelt einen Wert in seine Zeichenfolgendarstellung um. |
str::substring(string, start, end) |
Extrahiert eine Teilzeichenfolge nach Zeichenindex |
str::regex_matches(string, pattern) |
Gibt true zurück, wenn die Zeichenfolge dem regex-Muster entspricht. Nur in Datenflussdiagrammen verfügbar. |
str::regex_replace(string, pattern, replacement) |
Ersetzt alle regex-Übereinstimmungen durch die Ersetzungszeichenfolge. Nur in Datenflussdiagrammen verfügbar. |
Datums- und Uhrzeitfunktionen
Datums- und Uhrzeitfunktionen sind nur in Datenflussgraphen verfügbar. Mit Ausnahme von parse_timestampbenötigen Funktionen, die einen Zeitstempel akzeptieren, eine RFC-3339-Zeichenkette . Die Zeichenkette muss einen expliziten Offset von der koordinierten Universalzeit (UTC) enthalten, wie zum Beispiel 2026-06-17T12:00:00Z oder 2026-06-17T12:00:00-08:00. Die Spalte Returns listet den konzeptionellen Ergebnistyp auf, der typeof in Kleinbuchstaben als "float", "int", oder "string"angegeben wird.
| Funktion | Rückkehr | Beschreibung |
|---|---|---|
duration_between(start, end, unit) |
float |
Kalkuliert end - start mit Millisekundenpräzision. Unterstützte Einheiten sind "seconds", "millis", , "minutes", "hours"und "days". Unterschiede von weniger als einer Millisekunde geben .0 Das Ergebnis ist negativ, wenn end mindestens eine Millisekunde vor startliegt. |
day_of_week(timestamp) |
int |
Kehrt am Wochentag zurück, wo Sonntag und 0 Samstag .6 |
hour_of_day(timestamp) |
int |
Gibt die Stunde von 0 bis 23zurück. |
year_of(timestamp) |
int |
Es gibt das Kalenderjahr zurück. |
month_of(timestamp) |
int |
Gibt den Monat von 1 bis zu 12zurück. |
day_of_month(timestamp) |
int |
Gibt den Tag des Monats von 1 bis 31zu zurück. |
minute_of_hour(timestamp) |
int |
Gibt die Minute von durch 059zurück. |
second_of_minute(timestamp) |
int |
Gibt die zweite von 0 durch 59zurück. |
timezone_offset(timestamp) |
int |
Gibt den Zeitstempel-Offset von UTC in Minuten zurück. Zum Beispiel, die zurückgeben -08:00-480 und +05:30 .330 |
now() |
string |
Gibt die aktuelle UTC-Zeit als RFC 3339-Zeitstempel mit Millisekundenpräzision zurück. |
format_timestamp(timestamp, pattern) |
string |
Formatiert einen RFC 3339-Zeitstempel mithilfe eines Musters strftime . |
parse_timestamp(value, pattern) |
string |
Einen Wert wird mit einem strftime Muster analysiert und ein RFC 3339 UTC-Zeitstempel mit Millisekundenpräzision zurückgegeben. |
from_epoch(value, unit) |
string |
Wandelt einen Unix-Epochenwert mit Millisekundenpräzision in einen RFC 3339 UTC-Zeitstempel um. Unterstützte Einheiten sind "seconds", "millis", und "micros". Der Wert kann ein int oder floatsein. |
to_epoch(timestamp, unit) |
int |
Wandelt einen RFC-3339-Zeitstempel in eine Unix-Epochen-Ganzzahl um. Unterstützte Einheiten sind "seconds", "millis", und "micros". |
now() liest bei jeder Ausführung der Funktion die Systemuhr des Kubernetes-Knotens aus, der die Datenfluss-Workload hostet. Aufrufe im selben Ausdruck können unterschiedliche Werte zurückgeben. Bei einer Akkumulationsregel wird die Zeit zurückgegeben, now() in der das Fenster verarbeitet wird, nicht wann eine Eingabenachricht eintrifft. Um die Taktverschiebung zwischen Cluster-Knoten zu verringern, synchronisieren Sie jede Knotenuhr mit einer zuverlässigen Zeitquelle, wie etwa einem Network Time Protocol-Server.
Kalender- und Uhrfunktionen wie day_of_week, hour_of_day, und year_of, verwenden den Offset im Eingabezeitstempel. Sie wandeln den Wert nicht zuerst in UTC um. Die folgenden Beispiele zeigen dieses Verhalten.
| Ausdruck | Ergebnis |
|---|---|
hour_of_day("2026-06-17T23:30:45-08:00") |
23 |
day_of_week("2026-06-17T23:30:45-08:00") |
3 (Mittwoch) |
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 |
Format und Parse-Zeitstempel
Die format_timestamp und-Funktionen parse_timestamp verwenden strftime Muster. Die folgende Tabelle listet gängige Spezifikatoren auf.
| Spezifikationssymbol | Wert |
|---|---|
%Y |
Vierstellige Jahreszahl |
%m |
Zweistellige Angabe des Monats |
%d |
Zweistelliger Tag des Monats |
%H |
Stunde im 24-Stunden-Format |
%M |
Minute |
%S |
Zweites |
%f |
Nanosekunden seit der letzten ganzen Sekunde, ohne Dezimalpunkt |
%.f |
Bruchsekunden, einschließlich des Dezimalpunkts |
%z |
Numerischer UTC-Offset, wie zum Beispiel +0200 |
%:z |
Numerischer UTC-Offset mit einem Doppelpunkt, wie zum Beispiel +02:00 |
Für alle unterstützten Spezifikationen siehe die Chrono strftime-Dokumentation.
format_timestamp bewahrt den Offset des Eingabezeitstempels.
format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") gibt beispielsweise "2026-06-09 14:00 +02:00" zurück.
parse_timestamp Verarbeitet Eingaben in folgender Reihenfolge:
- Ein Datum und eine Uhrzeit mit numerischer Abstelle. Die Funktion berücksichtigt den Offset und normalisiert das Ergebnis auf UTC.
- Ein Datum und eine Uhrzeit ohne Offset. Die Funktion nimmt UTC an.
- Ein Date ohne Uhrzeit. Die Funktion geht von Mitternacht UTC aus.
Die folgenden Beispiele zeigen, wie parse_timestamp jeder Eingabetyp gehandhabt wird.
| Ausdruck | Ergebnis |
|---|---|
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" |
Von Bedeutung
parse_timestamp unterstützt keine reinen Zeitwerte oder Zeitzonenabkürzungen wie PST. Verwenden %z Sie oder %:z mit einem numerischen Offset anstelle von %Z. Parsing normalisiert Zeitstempel auf UTC, aber das Formatieren bewahrt den Eingabeoffset. Daher sind die beiden Funktionen keine exakten Inverse für Werte, die einen von null verschiedenen Offset enthalten.
Konvertiere Unix-Epochenwerte
Verwenden from_epoch Sie und to_epoch um zwischen Unix-Epochenwerten und RFC 3339-Zeitstempeln umzuwandeln.
| Ausdruck | Ergebnis |
|---|---|
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 akzeptiert negative Werte für Daten vor dem 1. Januar 1970. Seine Ausgabe hat eine Millisekundenpräzision, sodass die Umwandlung von Epochenmikrosekunden in einen Zeitstempel eine Genauigkeit unter einer Millisekunde verwirft.
to_epoch berücksichtigt den UTC-Offset des Zeitstempels und rundet die Werte vor 1970 bis zur nächstniedrigeren ganzen Zahl für die ausgewählte Einheit ab.
Datums- und Uhrzeitfunktionen können zusammengestellt werden. Zum Beispiel berechnet er das Alter in Tagen eines RFC 3339-Zeitstempels, duration_between($1, now(), "days") der als erste Regeleingabe angegeben wird. Um die Stunde eines Zeitstempels nach der Umwandlung in UTC zu lesen, verwenden hour_of_day(from_epoch(to_epoch($1, "micros"), "micros"))Sie .
Funktionen für bedingte und Sammlung
| Funktion | Beschreibung |
|---|---|
if(condition, trueVal, falseVal) |
Gibt zurück trueVal , wenn die Bedingung wahr ist, andernfalls falseVal |
min(values) |
Mindestens ein numerischer Wert oder ein Array |
max(values) |
Maximal ein oder mehrere numerische Werte oder ein Array |
contains(tuple, value) |
Gibt true zurück, wenn das Tupel den Wert enthält. |
contains_any(tuple, candidates) |
Gibt true zurück, wenn das Tupel einen beliebigen Wert aus dem Kandidaten-Tupel enthält. |
typeof(value) |
Gibt den Typ als Zeichenfolge zurück: "string", , "float", "int", "boolean", , oder "tuple""empty" |
Aggregationsfunktionen (nur Fenstertransformationen)
Diese Funktionen sind nur in Akkumulationsregeln innerhalb von Fenstertransformationen verfügbar. Jede akzeptiert eine einzelne Positionsvariable.
| Funktion | Rückkehr | Verhalten des leeren Fensters |
|---|---|---|
average($n) |
Mittelwert numerischer Werte | Fehler |
sum($n) |
Summe numerischer Werte | 0,0 |
min($n) |
Minimaler numerischer Wert | Fehler |
max($n) |
Maximaler numerischer Wert | Fehler |
count($n) |
Anzahl der Nachrichten, in denen das Feld vorhanden ist | 0 |
first($n) |
Erster Wert im Fenster | Fehler |
last($n) |
Letzter Wert im Fenster | Fehler |
Ausführliche Informationen zur Verwendung von Aggregationsfunktionen finden Sie unter "Aggregierte Daten im Laufe der Zeit".
Bedingte Logik
Verwenden Sie die if Funktion, um die Logik innerhalb eines Ausdrucks zu verzweigen:
| Ausdruck | Beschreibung |
|---|---|
if($1 > 100, "high", "normal") |
Gibt "Hoch" zurück, wenn die Temperatur 100 überschreitet. |
if($2 == (), $1, $1 * $2) |
Fällt auf $1 zurück, wenn $2 fehlt |
if($1 > 5, true, false) |
Gibt einen booleschen Wert basierend auf einem Schwellenwert zurück. |
Verwenden Sie () (den leeren Wert) im Vergleich, um fehlende Felder zu erkennen.
Tipp
Wenn Sie nur einen statischen Fallback für ein fehlendes Feld benötigen, ist die ?? <default> Syntax einfacher. Siehe Standardwerte. Reservieren Sie if für Fälle, in denen Sie zwischen berechneten Werten wählen müssen.
Metadatenfelder
Lesen und Schreiben in Nachrichtenmetadaten mithilfe des $metadata. Präfixes in den inputsoutput Feldern einer Regel. Metadatenverweise werden in den Feldpfad verschoben, nicht im Ausdruck selbst.
Metadateneigenschaften
-
Thema: Funktioniert sowohl für MQTT als auch für Kafka. Es enthält die Zeichenfolge, wo die Nachricht veröffentlicht wurde. Beispiel:
$metadata.topic. -
Benutzereigenschaft: In MQTT bezieht sich dies auf die Freiform-Schlüssel-Wert-Paare, die eine MQTT-Nachricht tragen kann. Wenn beispielsweise die MQTT-Nachricht mit einer Benutzereigenschaft mit der Schlüsselpriorität und dem Wert "high" veröffentlicht wurde, enthält der
$metadata.user_property.priorityVerweis den Wert "high". Benutzereigenschaftsschlüssel können beliebige Zeichenfolgen sein und erfordern möglicherweise Escape-Sequenzen:$metadata.user_property."weird key"verwendet den Schlüssel „weird key“ (mit einem Leerzeichen). -
Systemeigenschaft: Dieser Ausdruck wird für jede Eigenschaft verwendet, die keine Benutzereigenschaft ist. Derzeit wird nur eine einzelne Systemeigenschaft unterstützt:
$metadata.system_property.content_type, die die Inhaltstypeigenschaft der MQTT-Nachricht liest (sofern festgelegt). -
Kopfzeile: Dies ist das Kafka-Äquivalent der MQTT-Benutzereigenschaft. Kafka kann einen beliebigen binären Wert für einen Schlüssel verwenden, der Datenfluss unterstützt jedoch nur UTF-8-Zeichenfolgenschlüssel. Beispiel:
$metadata.header.priority. Diese Funktionalität ähnelt den Benutzereigenschaften.
| Feld | Beschreibung |
|---|---|
$metadata.topic |
Das MQTT-Thema der Nachricht |
$metadata.user_property.<key> |
Eine Benutzereigenschaft für die Nachricht, die durch den Schlüssel identifiziert wird |
$metadata.system_property.content_type |
Die Eigenschaft des Inhaltstypsystems |
$metadata.header.<key> |
Ein Durch Schlüssel identifizierter Kafka-Headerwert |
Aus Metadaten lesen
Um auf das Quellthema und eine Benutzereigenschaft in einem Ausdruck zu verweisen, listen Sie sie als Eingaben auf:
| Eingabe | Variable |
|---|---|
$metadata.topic |
$1 |
$metadata.user_property.device_id |
$2 |
Ausdruck: $1 + "/" + $2
Im folgenden Beispiel wird die MQTT-Eigenschaft topic dem Feld origin_topic in der Ausgabe zugeordnet:
| Eingabe | Output |
|---|---|
$metadata.topic |
origin_topic |
Wenn die Benutzereigenschaft priority in der MQTT-Nachricht vorhanden ist, veranschaulicht das folgende Beispiel, wie sie einem Ausgabefeld zugeordnet wird:
| Eingabe | Output |
|---|---|
$metadata.user_property.priority |
priority |
In Metadaten schreiben
Verwenden Sie $metadata.user_property.<key> zum Festlegen einer Benutzereigenschaft für die Ausgabemeldung als Ausgabefeld.
Wenn Sie ein Metadatenfeld auf einen leeren Wert (()) festlegen, wird es entfernt. Für Benutzereigenschaften sind doppelte Schlüssel zulässig.
Sie können Metadateneigenschaften auch einem Ausgabeheader oder einer Benutzereigenschaft zuordnen. Im folgenden Beispiel wird die MQTT-Eigenschaft topic dem Feld origin_topic in der Benutzereigenschaft der Ausgabe zugeordnet:
| Eingabe | Output |
|---|---|
$metadata.topic |
$metadata.user_property.origin_topic |
Wenn die eingehende Nutzlast ein priority-Feld enthält, veranschaulicht das folgende Beispiel, wie sie einer MQTT-Benutzereigenschaft zugeordnet wird:
| Eingabe | Output |
|---|---|
priority |
$metadata.user_property.priority |
Das gleiche Beispiel für Kafka:
| Eingabe | Output |
|---|---|
priority |
$metadata.header.priority |
Metadatenfelder werden in Zuordnungs-, Filter- und Verzweigungsregeln unterstützt. Sie sind in Fensterregeln (akkumuliert) nicht verfügbar.
Letzter bekannter Wert
Verwenden Sie das ? $last Suffix für eine Eingabe, um die Laufzeit anweisen, den letzten Wert für dieses Feld zu merken. Wenn das Feld in der aktuellen Nachricht fehlt, wird stattdessen der letzte bekannte Wert verwendet.
| Eingabe | Verhalten |
|---|---|
temperature ? $last |
Verwendet die letzte bekannte Temperatur, wenn die aktuelle Nachricht kein temperature Feld enthält. |
Bei der ? $last Direktive wird zwischen Groß- und Kleinschreibung unterschieden und flexible Leerzeichen unterstützt.
Von Bedeutung
Zuletzt bekannte Werte werden nur im Arbeitsspeicher gespeichert. Sie gehen verloren, wenn der Pod neu gestartet wird und nicht für Replikate freigegeben wird.
Der letzte bekannte Wert wird in Zuordnungs-, Filter- und Verzweigungsregeln unterstützt. Es ist in Fensterregeln (kumuliert) nicht verfügbar.
Standardwerte
Verwenden Sie das ?? <default> Suffix für eine Eingabe, um einen Fallbackwert bereitzustellen, wenn das Feld fehlt. Unterstützte Standardtypen: integer, float, boolean, string, and null.
Hinweis
Die ?? <default> Syntax ist nur in Datenflussdiagrammen verfügbar. Sie wird in Datenflusseingaben builtInTransformation nicht unterstützt.
| Eingabe | Ausweichplan |
|---|---|
temperature ?? 0 |
Ganze Zahl 0 |
status ?? "unknown" |
Zeichenfolge "unbekannt" |
threshold ?? 98.6 |
Schwimmer 98,6 |
enabled ?? true |
Boolescher Wert true |
Letzten bekannten Wert und Standardwert kombinieren
Sie können kombinieren ? $last und ?? <default>. Die Laufzeit überprüft zuerst die aktuelle Nachricht, dann den letzten bekannten Wert und dann den Standardwert. Wenn Sie ohne ?? <default>Diese Verwenden verwenden? $last, überprüft die Laufzeit die aktuelle Nachricht und dann die Standardeinstellung direkt.
| Eingabe | Auswertungsreihenfolge |
|---|---|
temperature ?? 0 |
Aktueller Wert, dann Standard (0) |
temperature ? $last ?? 0 |
Aktueller Wert, dann zuletzt bekannt, dann Standard (0) |
Standardwerte werden in Zuordnungs-, Filter- und Verzweigungsregeln unterstützt. Sie sind in Fensterregeln (akkumuliert) nicht verfügbar.
Datentypen
| Typ | Beschreibung | Beispiel |
|---|---|---|
| Int | 64-Bit vorzeichenbehaftete Ganzzahl |
42, -7 |
| Schweben | 64-Bit-Gleitkomma |
3.14, -0.5 |
| String | UTF-8-Text | "hello" |
| Bool | Boolean |
true, false |
| Tupel | Array von Grundtypenwerten | (1, 2, 3) |
| Leer | Fehlender oder NULL-Wert | () |
| JSON | JSON-Objekt übergeben | (kann in Ausdrücken nicht verwendet werden) |
JSON-Objekte und Arrays werden as-is beibehalten, wenn Felder ohne Ausdruck kopiert werden, aber sie können nicht als Eingaben für die Ausdrucksauswertung verwendet werden.
Featureunterstützung nach Transformationstyp
Die gleiche Ausdruckssprache funktioniert über Transformationen hinweg, aber das Ergebnis eines Ausdrucks bedeutet in jeder Transformation etwas anderes:
| Umwandeln | Was der Ausdruck Ergebnis bewirkt |
|---|---|
| Map | Erzeugt den Wert, der auf geschrieben wird output |
| Filter | Wenn sie wahr ist, wird die Botschaft fallen gelassen. Um die Nachrichten weiterhin abzustimmen, kehrt man den Ausdruck um. |
| Filiale | Leitet die Nachricht an den true ODER-Pfad false weiter. Nichts geht verloren. |
| Fenster (akkumulieren) | Erzeugt den aggregierten Wert für das Fenster |
| Funktion | Map | Filter | Filiale | Fenster (akkumulieren) |
|---|---|---|---|---|
| Positionsvariablen | Ja | Ja | Ja | Ja |
| Betriebspersonal | Ja | Ja | Ja | Ja |
| Integrierte Funktionen | Ja | Ja | Ja | Ja |
| Aggregationsfunktionen | No | No | No | Ja |
$metadata Zugriff |
Ja | Ja | Ja | No |
$context Bereicherung |
Ja | Ja | Ja | No |
? $last |
Ja | Ja | Ja | No |
?? <default> ¹ |
Ja | Ja | Ja | No |
str::regex_matches
/
str::regex_replace ¹ |
Ja | Ja | Ja | No |
| Platzhalter | Ja | No | No | No |
¹ Nur in Datenflussdiagrammen verfügbar. In Datenflusseingaben builtInTransformation nicht unterstützt.
Punktnotation und Escapezeichen
Punktnotation wird häufig verwendet, um auf geschachtelte Felder zu verweisen. Ein standardmäßiger Punktnotationspfad sieht wie Person.Address.Street.Numberfolgt aus.
In einem Datenfluss kann ein durch Punkt notation beschriebener Pfad Zeichenfolgen und einige Sonderzeichen enthalten, ohne dass es escapeing erforderlich ist, z Person.Date of Birth. B. .
In anderen Fällen ist die Flucht erforderlich, z. B.: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Dieser Pfad enthält unter anderem Sonderzeichen Punkte innerhalb des Feldnamens. Ohne Escape-Sequenz würde der Feldname selbst als Trennzeichen in der Punktnotation dienen.
Beim Parsen eines Pfads behandelt der Datenfluss lediglich zwei Zeichen als Sonderzeichen:
- Punkte (
.) fungieren als Feldtrennzeichen. - Doppelte Anführungszeichen, wenn sie am Anfang oder Ende eines Segments platziert werden, beginnen einen entweichten Abschnitt, in dem Punkte nicht als Feldtrenner behandelt werden.
Alle weiteren Zeichen werden als Teil des Feldnamens behandelt. Diese Flexibilität ist in Formaten wie JSON hilfreich, bei denen Feldnamen beliebige Zeichenfolgen sein können.
Die Pfaddefinition muss auch den Regeln des Konfigurationsformats entsprechen. Wenn ein Zeichen mit besonderer Bedeutung im Pfad enthalten ist, ist eine ordnungsgemäße Anführung erforderlich. Feldnamen, die mit einem Doppelpunkt (wie :Person:.:name:) beginnen oder mit einer Zahl beginnen, gefolgt von Text (wie 100 celsius.hot) müssen in der Konfiguration richtig als Zeichenfolgen interpretiert werden.
Escaping
Die hauptfunktion der Escapefunktion in einem punktierten Pfad besteht darin, die Verwendung von Punkten, die Teil von Feldnamen sind, anstelle von Trennzeichen zu berücksichtigen. Der Pfad Payload."Tag.10".Value besteht beispielsweise aus drei Segmenten: Payload, , Tag.10und Value. Durch die doppelten Anführungszeichen Tag.10 wird verhindert, dass der Punkt als Trennzeichen fungiert.
Escape-Regeln in der Punktnotation
Escapefunktion für einzelne Segmente: Wenn mehrere Segmente Punkte enthalten, müssen diese Segmente in doppelte Anführungszeichen eingeschlossen werden. Andere Segmente können auch zitiert werden, wirken sich jedoch nicht auf die Pfadinterpretation aus. Beispiel:
Payload."Tag.10".Measurements."Vibration.$12".ValueZitieren Sie einen Abschnitt nur, wenn er entkommen muss. Fügen Sie nur dann doppelte Anführungszeichen um ein Segment hinzu, wenn es einen Punkt enthält (oder ein anderes Zeichen, das sonst als Trennzeichen gelesen würde). Zitiere keinen gewöhnlichen Feldnamen.
Zum Beispiel, für ein Feld namens in
TagNameRecords:Mach das Nicht das hier Records.TagNameRecords."TagName"Die zusätzlichen Anführungszeichen helfen nicht weiter, und in manchen Tools, wie dem Operations Experience Data Flow Editor, werden sie Teil des Feldnamens. Die Abbildung sucht dann nach einem Feld mit
"TagName"dem Namen (Anführungszeichen eingeschlossen), das aber nicht existiert, sodass nichts übereinstimmt. Das erkennt man in der Definition des exportierten Datenflusses, wo der Name mit entweichten Anführungszeichen erscheint, wie zum Beispiel\"TagName\". Um das zu beheben, entferne die Anführungszeichen, sodass der Name einfachTagName.Ordnungsgemäße Verwendung von doppelten Anführungszeichen: Doppelte Anführungszeichen müssen ein Escape-Segment öffnen und schließen. Alle Anführungszeichen in der Mitte des Abschnitts werden als Teil des Feldnamens betrachtet. Der Pfad
Payload.He said: "Hello", and waveddefiniert beispielsweise zwei Felder:PayloadundHe said: "Hello", and waved. Wenn unter diesen Umständen ein Punkt angezeigt wird, dient er weiterhin als Trennzeichen. Beispielsweise wird der PfadPayload.He said: "No. It is done"in die SegmentePayloadaufgeteilt,He said: "NoundIt is done"(beginnend mit einem Leerzeichen).
Segmentierungsalgorithmus
- Wenn das erste Zeichen eines Segments ein Anführungszeichen ist, sucht der Parser nach dem nächsten Anführungszeichen. Die zwischen diesen Anführungszeichen eingeschlossene Zeichenfolge wird als einzelnes Segment interpretiert.
- Wenn das Segment nicht mit einem Anführungszeichen beginnt, identifiziert der Parser Segmente, indem er nach dem nächsten Punkt oder nach dem Ende des Pfads sucht.
Platzhalter
Verwenden Sie einen Wildcard (*) in Eingabe- und Ausgabepfaden, um mehrere Felder gleichzeitig abzugleichen. Dies ist nützlich, wenn die Ausgabe genau der Eingabe ähnelt oder wenn Sie dieselbe Transformation auf viele Felder anwenden müssen, ohne jede listet.
Von Bedeutung
Die Jokerbeispiele in diesem Abschnitt passieren durch die Felder, die die Eingabe enthält. Für MQTT, Kafka und andere JSON-Ausgaben ist das in Ordnung. Für ein Speicherziel mit Parquet- oder Delta-Serialisierung muss das Ausgabeschema jedes Blatt deklarieren, auf das die Wildcard expandiert. Wenn die Laufzeitnutzlast ein Feld enthält, das das Schema nicht deklariert, wird der Datensatz entfernt. Generiere das Schema aus repräsentativen Stichprobendaten und sieh dir das Verhalten der Speicherserialisierung an.
Alle Felder kopieren
So übergeben Sie jedes Feld unverändert:
| Eingabe | Output |
|---|---|
* |
* |
Die * Übereinstimmung mit jedem Feldpfad in der Eingabe und platziert ihn an demselben Pfad in der Ausgabe. Der Teil des Pfads, der übereinstimmt, * wird als erfasstes Segment bezeichnet. In der Ausgabe ersetzt das erfasste Segment das *.
Geschachtelte Felder flachten
Um Felder aus einem geschachtelten Objekt auf die Stammebene zu verschieben, platzieren Sie das Präfix in der Eingabe und * in der Ausgabe:
| Eingabe | Output |
|---|---|
Sensors.* |
* |
Metadata.* |
* |
Aufgrund dieser Eingabe:
{
"Sensors": { "Temperature": 72.5, "Pressure": 14.7 },
"Metadata": { "LineId": "Line-3", "Shift": "A" }
}
Die Ausgabe flacht beide Objekte ab:
{
"Temperature": 72.5,
"Pressure": 14.7,
"LineId": "Line-3",
"Shift": "A"
}
Neustrukturieren von Feldern
Wenn Sie Felder unter einem neuen übergeordneten Element verschieben möchten, fügen * Sie die Eingabe ein, und fügen Sie der Ausgabe ein Präfix hinzu:
| Eingabe | Output |
|---|---|
* |
Telemetry.* |
Dadurch werden alle Felder der obersten Ebene innerhalb eines Telemetry Objekts umbrochen.
Platzhalterplatzierungsregeln
- Pro Eingabe- oder Ausgabepfad ist nur ein Wert
*zulässig. - Das
*Muss mit einem vollständigen Segment übereinstimmen (kein Teilsegment wieSensor*). - Dies
*kann am Anfang (*.Value), der Mitte (Sensors.*.Reading) oder dem Ende (Sensors.*) eines Pfads angezeigt werden.
Platzhalter für mehrere Eingaben
Wenn eine Regel über mehrere Eingaben mit Wildcards verfügt, muss * Segment für alle Eingaben erfasst werden. Die Laufzeit löst die * erste Eingabe auf und sucht dann nach übereinstimmenden Pfaden in den anderen Eingaben.
Um beispielsweise die Maximalen- und Min.-Werte für jeden Sensor zu mittelieren:
| Eingabe | Output | Ausdruck |
|---|---|---|
*.Max (1 $)*.Min (2 $) |
Averaged.* |
($1 + $2) / 2 |
Aufgrund dieser Eingabe:
{
"Temperature": { "Max": 85.3, "Min": 62.1 },
"Pressure": { "Max": 15.2, "Min": 14.1 }
}
Die * Erfassungen Temperature werden zuerst erfasst, sodass die Regel nach beiden Temperature.Max und Temperature.Min. Anschließend wird er erfasst Pressure und sucht und suchtPressure.Max.Pressure.Min Die Ausgabe lautet wie folgt:
{
"Averaged": { "Temperature": 73.7, "Pressure": 14.65 }
}
Wenn eine Eingabe für ein erfasstes Segment nicht aufgelöst werden kann (z *.Mid.Avg . B. wenn das Feld anders geschachtelt ist), wird dieses Segment übersprungen. Stellen Sie sicher, dass die Pfade in allen Eingaben die tatsächliche Struktur der Daten widerspiegeln.
Überschreiben eines Wildcards für bestimmte Felder
Sie können eine Wildcardregel mit bestimmten Regeln kombinieren. Bestimmte Regeln haben Vorrang, wenn sie eine niedrigere Abdeckung haben (weniger Segmente übereinstimmend).* Dies wird als Spezialisierung bezeichnet.
| Eingabe | Output | Ausdruck |
|---|---|---|
*.Max (1 $)*.Min (2 $) |
Averaged.* |
($1 + $2) / 2 |
Pressure.Max (1 $)Pressure.Min (2 $) |
Averaged.PressureAdj |
($1 + $2 + 1.0) / 2 |
Die erste Regel gilt für alle Felder. Die zweite Regel setzt sie Pressure nur außer Kraft, da Pressure.Max sie spezifischer ist als *.Max (Abdeckung 0 vs. Abdeckung 1).
Um ein Feld vollständig auszuschließen, verwenden Sie eine leere Ausgabe:
| Eingabe | Output |
|---|---|
Pressure.Max, Pressure.Min |
(leer) |
Eine leere Ausgabe legt das Feld aus dem Ergebnis ab. Dadurch werden alle Wildcardregel außer Kraft gesetzt, die sie andernfalls enthalten würde.
Mehrere Regeln für dieselben Eingaben
Wenn zwei Regeln die gleiche oder höhere Abdeckung aufweisen, gelten beide. Auf diese Weise können Sie mehrere abgeleitete Werte aus denselben Eingaben berechnen:
| Eingabe | Output | Ausdruck |
|---|---|---|
*.Max (1 $)*.Min (2 $) |
Stats.*.Avg |
($1 + $2) / 2 |
*.Max (1 $)*.Min (2 $) |
Stats.*.Range |
$1 - $2 |
Beide Regeln werden für jedes erfasste Segment ausgeführt und erzeugen zwei Ausgabefelder pro Sensor.
Platzhalter in den Kontextualisierungsdatensätzen
Sie können Wildcards mit $context Verweisen verwenden, um alle Felder aus einem Dataset zu kopieren:
| Eingabe | Output |
|---|---|
$context(assetMeta).* |
Asset.* |
Dadurch wird jedes Feld aus dem assetMeta Dataset in den Asset Abschnitt der Ausgabe kopiert.
Kontextbezogene Datasets
Kontextbezogene Datasets ermöglichen zuordnungen die Integration zusätzlicher Daten aus externen Datenbanken. Verwenden Sie das $context(datasetName) Präfix, um felder aus einem Dataset zu referenzieren. Liest z. B $context(position).BaseSalary . das BaseSalary Feld aus einem Dataset mit dem Namen position.
Ausführliche Informationen zum Konfigurieren von Kontextisierungsdatensätzen finden Sie unter "Anreichern von Daten mithilfe von Datenflüssen und Anreichern mit externen Daten in Datenflussdiagrammen".
Verwandte Inhalte
Wenn Sie hierher gekommen sind, um nach der Syntax einer bestimmten Transformation zu suchen, zeigen diese Artikel Ausdrücke im Kontext:
| Um dies zu tun | Siehe |
|---|---|
Umbenennen, umstrukturieren oder Felder berechnen, einschließlich Einheitenumwandlungen wie cToF |
Transformieren von Daten mit Zuordnung in Datenflussdiagrammen |
| Lassen Sie Nachrichten fallen oder leiten Sie sie mit einer Bedingung auf verschiedene Pfade um | Filtern und Weiterleiten von Daten in Datenflussdiagrammen |
| Berechnen Sie Durchschnitte, Summen oder Zählungen über ein Zeitfenster | Aggregieren von Daten im Laufe der Zeit |
| Suchen Sie Referenzdaten im State Store nach | Anreichern mit externen Daten |
| Setze das Ausgabe-MQTT-Thema aus dem Nachrichteninhalt | Weiterleiten von Nachrichten an verschiedene Themen |
| Baue die Pipeline, die diese Transformationen enthält | Verarbeitungsdaten mit Datenflussdiagrammen |
Für Datenflüsse siehe Map data by using data flows and Filter data in a data flow.