Ausdrückereferenz für Datenflüsse und Datenflussgraphen

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:

  1. Ein Datum und eine Uhrzeit mit numerischer Abstelle. Die Funktion berücksichtigt den Offset und normalisiert das Ergebnis auf UTC.
  2. Ein Datum und eine Uhrzeit ohne Offset. Die Funktion nimmt UTC an.
  3. 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.priority Verweis 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".Value

  • Zitieren 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.TagName Records."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 einfach TagName.

  • 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 waved definiert beispielsweise zwei Felder: Payload und He said: "Hello", and waved. Wenn unter diesen Umständen ein Punkt angezeigt wird, dient er weiterhin als Trennzeichen. Beispielsweise wird der Pfad Payload.He said: "No. It is done" in die Segmente Payloadaufgeteilt, He said: "Nound It 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 wie Sensor*).
  • 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".

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.