Wyrażenia referencyjne dla przepływów danych i grafów przepływu danych

Ta dokumentacja dotyczy zarówno przepływów danych , jak i wykresów przepływu danych. Oba używają tego samego języka wyrażeń do przekształcania map, filtrowania i wzbogacania. Wykresy przepływu danych obsługują również przekształcenia gałęzi i okien (skumulowanych), które są zanotowane tam, gdzie ma to zastosowanie.

Zmienne pozycyjne

Tablica inputs każdej reguły określa zmienne dostępne w obiekcie expression. Pierwsze dane wejściowe stają się $1wartością , a druga staje się $2i tak dalej.

Dane wejściowe Wyrażenie Wynik
Position, Office $1 + ", " + $2 Łączenie pozycji i pakietu Office z przecinkami
temperature cToF($1) Konwertuje stopnie Celsjusza na Fahrenheit
temperature, humidity $1 * $2 < 100000 Sprawdza próg dla dwóch pól

Jeśli określono tylko jedno dane wejściowe i nie podano żadnego wyrażenia, wartość w tym wejściu jest kopiowana bezpośrednio do danych wyjściowych.

Operatorów

Wyrażenia obsługują następujące operatory wymienione od najwyższego do najniższego pierwszeństwa:

Precedence Operatorów Opis
1 ! Not logiczny (jednoargumentowy)
2 ^ Potęgowanie
3 *, , /% Mnożenie, dzielenie, modulo
4 +, - Dodawanie/łączenie ciągów, odejmowanie
5 <, , >, , <=>= Porównanie
6 ==, != Równość, nierówności
7 && Logiczne AND
8 \|\| Alternatywa logiczna

Operator + łączy ciągi, gdy co najmniej jeden operand jest ciągiem. Użyj nawiasów, aby zastąpić domyślny pierwszeństwo.

Ważna

Używaj symbolicznych operatorów && logicznych (AND), || (OR) i ! (NOT). Słowo kluczowe tworzy and, or, i not nie jest obsługiwane. Na przykład zapisz $1 == "a" || $1 == "b" zamiast $1 == "a" or $1 == "b".

Przykłady:

Wyrażenie Opis
$1 * 2 ^ 3 Najpierw wykładniczo: $1 * 8
($1 * 2) ^ 3 Przesłonięcia nawiasów: najpierw pomnóż
-$1 * 2 Najpierw negacja, a następnie pomnoż
$1 > 100 && $2 > 200 Łączenie warunków z logicznymi i

Wbudowane funkcje

Funkcje konwersji jednostek

Te funkcje akceptują pojedynczą wartość liczbową i zwracają zmiennoprzecinkowy.

Function Konwersja Formula
cToF(value) Stopnie Celsjusza do Fahrenheita F = (C × 9/5) + 32
fToC(value) Fahrenheit do Stopni Celsjusza C = (F - 32) × 5/9
psiToBar(value) Interfejs PSI do paska bar = PSI × 0,0689476
barToPsi(value) Pasek do interfejsu PSI PSI = bar / 0,0689476
inToCm(value) Centymetry do centymetrów cm = w × 2,54
cmToIn(value) Centymetry do cali in = cm / 2,54
ftToM(value) Stopy do metrów m = ft × 0,3048
mToFt(value) Mierniki do stóp ft = m / 0,3048
lbToKg(value) Funty do kilogramów kg = lb × 0,453592
kgToLb(value) Kilogramy do funtów lb = kg / 0,453592
galToL(value) Galony amerykańskie do litrów L = gal × 3,78541
lToGal(value) Litry do galonów amerykańskich gal = L / 3,78541

Funkcje skalowania i zaokrąglania

Function Opis
scale(value, srcLo, srcHi, dstLo, dstHi) Skaluje value liniowo z zakresu źródłowego do zakresu docelowego. Wszystkie pięć argumentów musi być numeryczne.
round_n(value, decimals) Zaokrągla zmiennoprzecinkowy do określonej liczby miejsc dziesiętnych (od 0 do 15).

Funkcje matematyczne

Te funkcje pochodzą z wbudowanej biblioteki matematycznej.

Function Opis
floor(value) Największa liczba całkowita mniejsza lub równa liczbie
round(value) Najbliższa liczba całkowita, zaokrąglanie przypadków w połowie drogi z dala od 0,0
ceil(value) Najmniejsza liczba całkowita większa lub równa liczbie
math::abs(value) Wartość bezwzględna
math::sqrt(value) Pierwiastek kwadratowy (zwraca wartość NaN dla liczb ujemnych)
math::cbrt(value) Korzeń modułu
math::ln(value) Logarytm naturalny
math::log2(value) Logarytm base-2
math::log10(value) Logarytm base-10
math::log(value, base) Logarytm z dowolną bazą
math::exp(value) e podniesione do potęgi wartości
math::exp2(value) 2 podniesione do potęgi wartości
math::pow(base, exp) Podnosi podstawy do potęgi exp
math::cos(value) Cosinus (radiany)
math::sin(value) Sinus (radiany)
math::tan(value) Tangens (radiany)
math::acos(value) Arccosinus (zwraca radiany)
math::asin(value) Arcsine (zwraca radiany)
math::atan(value) Arctangent (zwraca radiany)
math::atan2(y, x) Arcus co cztery ćwiartki (zwraca radiany)
math::hypot(a, b) Długość niedociągnięć od boków a i b

Funkcje łańcuchów znakowych

Function Opis
len(string) Długość znaku ciągu lub liczby elementów krotki
str::to_lowercase(string) Konwertuje na małe litery
str::to_uppercase(string) Konwertuje na wielkie litery
str::trim(string) Usuwa białe znaki wiodące i końcowe
str::from(value) Konwertuje wartość na reprezentację ciągu
str::substring(string, start, end) Wyodrębnia podciąg według indeksu znaków
str::regex_matches(string, pattern) Zwraca wartość true, jeśli ciąg pasuje do wzorca wyrażenia regularnego. Dostępne tylko w wykresach przepływu danych.
str::regex_replace(string, pattern, replacement) Zastępuje wszystkie dopasowania wyrażeń regularnych ciągiem zastępczym. Dostępne tylko w wykresach przepływu danych.

Funkcje daty i godziny

Funkcje daty i czasu są dostępne tylko w grafach przepływu danych. Z wyjątkiem parse_timestamp, funkcje akceptujące znacznik czasu wymagają ciągu RFC 3339 . Ciąg musi zawierać jawne przesunięcie względem Skoordynowanego Czasu Uniwersalnego (UTC), takie jak 2026-06-17T12:00:00Z lub 2026-06-17T12:00:00-08:00. Kolumna Returns zawiera typ wyniku, który typeof podaje się małymi literami jako "float", "int", lub "string".

Function Zwroty Opis
duration_between(start, end, unit) float Oblicza end - start z precyzją milisekundy. Jednostki wspierane to "seconds", "millis", "minutes", "hours", oraz ."days" Różnice zwrotu 0mniejsze niż jedna milisekunda. Wynik jest ujemny, gdy end jest co najmniej o milisekundę przed start.
day_of_week(timestamp) int Wraca w dzień tygodnia, gdzie jest 0 niedziela, a sobota .6
hour_of_day(timestamp) int Zwraca godzinę od 0 do 23.
year_of(timestamp) int Zwraca rok kalendarzowy.
month_of(timestamp) int Zwraca miesiąc od 1 do 12.
day_of_month(timestamp) int Zwraca dzień miesiąca od 1 do 31.
minute_of_hour(timestamp) int Zwraca minutę od 0 do 59.
second_of_minute(timestamp) int Zwraca sekundę od 0 do 59.
timezone_offset(timestamp) int Zwraca przesunięcie znacznika czasu względem UTC w ciągu minut. Na przykład zwraca -08:00-480 i +05:30 zwraca 330.
now() string Zwraca aktualny czas UTC jako znacznik czasu RFC 3339 z precyzją milisekund.
format_timestamp(timestamp, pattern) string Formatuje znacznik czasu RFC 3339 za pomocą wzoru strftime .
parse_timestamp(value, pattern) string Parsuje wartość za pomocą wzorca strftime i zwraca znacznik czasu RFC 3339 UTC z precyzją milisekund.
from_epoch(value, unit) string Konwertuje wartość epoki Unix na znacznik czasu RFC 3339 UTC z precyzją milisekund. Jednostki wspierane to "seconds", "millis", oraz "micros". Wartość ta może być lub intfloat.
to_epoch(timestamp, unit) int Konwertuje znacznik czasu RFC 3339 na całkowitą liczbę epoki Uniks. Jednostki wspierane to "seconds", "millis", oraz "micros".

now() odczytuje zegar systemowy węzła Kubernetes, który jest hostem obciążenia przepływu danych, za każdym razem, gdy funkcja się uruchamia. Wywołania w tym samym wyrażeniu mogą zwracać różne wartości. W zasadzie akumulacji zwraca now() się czas przetwarzania okna, a nie moment nadejścia wiadomości wejściowej. Aby zmniejszyć przesunięcie zegara między węzłami klastra, zsynchronizuj każdy zegar z wiarygodnym źródłem czasu, takim jak serwer Network Time Protocol.

Funkcje kalendarza i zegara, takie jak day_of_week, hour_of_day, oraz year_of, wykorzystują przesunięcie w znaczniku czasu wejścia. Nie przeliczają najpierw wartości na UTC. Poniższe przykłady pokazują takie zachowanie.

Wyrażenie Wynik
hour_of_day("2026-06-17T23:30:45-08:00") 23
day_of_week("2026-06-17T23:30:45-08:00") 3 (Środa)
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 i parsowanie znaczników czasu

Funkcje format_timestamp i wykorzystują parse_timestampstrftime wzorce. Poniższa tabela przedstawia wspólne specyfikatory.

Specyfikator Value
%Y Czterocyfrowy rok
%m Dwucyfrowy miesiąc
%d Dwucyfrowy dzień miesiąca
%H Godzina w formacie 24-godzinnym
%M Minuta
%S Sekunda
%f Nanosekundy od ostatniej pełnej sekundy, bez przecinka dziesiętnego
%.f Ułamki sekund, wliczając przecinek po przecinku
%z Numeryczne przesunięcie UTC, takie jak +0200
%:z Przesunięcie numerycznego UTC dwukropkiem, takie jak +02:00

Wszystkie obsługiwane specyfikatory można znaleźć w dokumentacji Chrono strftime.

format_timestamp zachowuje przesunięcie czasu wejściowego znacznika. Na przykład format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") zwraca wartość "2026-06-09 14:00 +02:00".

parse_timestamp obsługuje wejścia w następującej kolejności:

  1. Data i godzina z przesunięciem liczbowym. Funkcja honoruje przesunięcie i normalizuje wynik do UTC.
  2. Data i godzina bez przesunięcia. Funkcja zakłada UTC.
  3. Randka bez godziny. Funkcja zakłada północ UTC.

Poniższe przykłady pokazują, jak parse_timestamp obsługuje każdy typ wejścia.

Wyrażenie Wynik
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"

Ważna

parse_timestamp nie obsługuje wartości tylko czasowych ani skrótów stref czasowych, takich jak PST. Użyj %z lub %:z z przesunięciem numerycznym zamiast .%Z Parsowanie normalizuje znaczniki czasu do UTC, ale formatowanie zachowuje przesunięcie wejściowe. Dlatego obie funkcje nie są dokładnymi odwrotnościami dla wartości zawierających niezerowy offset.

Przekonwertowanie wartości epok Unix

Używaj from_epoch i to_epoch konwertuj między wartościami epoki Unix a znacznikami czasowymi RFC 3339.

Wyrażenie Wynik
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 akceptuje wartości ujemne dla dat sprzed 1 stycznia 1970 roku. Jego wyjście ma precyzję milisekundową, więc przeliczenie mikrosekund epoki na znacznik czasu eliminuje precyzję poniżej jednej milisekundy. to_epoch uwzględnia przesunięcie UTC znacznika czasu i zaokrągla wartości sprzed 1970 roku do następnej niższej liczby całkowitej dla wybranej jednostki.

Można komponować funkcje daty i czasu. Na przykład oblicza duration_between($1, now(), "days") wiek w kilku dniach znacznika czasu RFC 3339 jako pierwszego wpisu reguły. Aby odczytać godzinę znacznika czasu po konwersji na UTC, użyj hour_of_day(from_epoch(to_epoch($1, "micros"), "micros")).

Funkcje warunkowe i kolekcji

Function Opis
if(condition, trueVal, falseVal) Zwraca wartość trueVal , gdy warunek ma wartość true, w przeciwnym razie falseVal
min(values) Co najmniej jedna wartość liczbowa lub tablica
max(values) Maksymalnie co najmniej jedna wartość liczbowa lub tablica
contains(tuple, value) Zwraca wartość true, jeśli krotka zawiera wartość
contains_any(tuple, candidates) Zwraca wartość true, jeśli krotka zawiera dowolną wartość z krotki kandydatów
typeof(value) Zwraca typ jako ciąg: "string", , "float", "int""boolean", lub "tuple""empty"

Funkcje agregacji (tylko przekształcenia okien)

Te funkcje są dostępne tylko w regułach akumulacyjnych w ramach przekształceń okien. Każda z nich przyjmuje pojedynczą zmienną pozycyjną.

Function Zwroty Zachowanie pustego okna
average($n) Średnia wartości liczbowych Błąd
sum($n) Suma wartości liczbowych 0,0
min($n) Minimalna wartość liczbowa Błąd
max($n) Maksymalna wartość liczbowa Błąd
count($n) Liczba komunikatów, w których istnieje pole 0
first($n) Pierwsza wartość w oknie Błąd
last($n) Ostatnia wartość w oknie Błąd

Aby uzyskać szczegółowe informacje na temat korzystania z funkcji agregacji, zobacz Agregowanie danych w czasie.

Logika warunkowa

if Użyj funkcji , aby rozgałęzić logikę w wyrażeniu:

Wyrażenie Opis
if($1 > 100, "high", "normal") Zwraca wartość "wysoką", gdy temperatura przekracza 100
if($2 == (), $1, $1 * $2) Spada z powrotem do $1, gdy brakuje $2
if($1 > 5, true, false) Zwraca wartość logiczną na podstawie progu

Użyj () wartości (pustej) w porównaniach, aby wykryć brakujące pola.

Wskazówka

Jeśli potrzebujesz tylko statycznego rezerwowego dla brakującego pola, składnia jest prostsza ?? <default> . Zobacz Wartości domyślne. Zarezerwuj if dla przypadków, w których należy wybrać między obliczonymi wartościami.

Pola metadanych

Odczytywanie i zapisywanie metadanych komunikatów przy użyciu prefiksu $metadata. w inputs polach lub output reguły. Odwołania do metadanych idą w ścieżce pola, a nie w samym wyrażeniu.

Właściwości metadanych

  • Temat: działa zarówno w przypadku MQTT, jak i platformy Kafka. Zawiera on ciąg, w którym opublikowano komunikat. Przykład: $metadata.topic.
  • Właściwość użytkownika: W MQTT odnosi się to do par klucz/wartość dowolnej postaci, które może przenosić komunikat MQTT. Jeśli na przykład komunikat MQTT został opublikowany z właściwością użytkownika z kluczem "priority" i wartością "high", $metadata.user_property.priority odwołanie zawiera wartość "high". Klucze właściwości użytkownika mogą być dowolnymi ciągami i mogą wymagać ucieczki: $metadata.user_property."weird key" używa klucza "dziwnego klucza" (z spacją).
  • Właściwość systemowa: ten termin jest używany dla każdej właściwości, która nie jest właściwością użytkownika. Obecnie obsługiwana jest tylko jedna właściwość systemu: $metadata.system_property.content_type, która odczytuje właściwość typu zawartości komunikatu MQTT (jeśli ustawiono).
  • Nagłówek: To odpowiednik właściwości użytkownika MQTT w systemie Kafka. Platforma Kafka może używać dowolnej wartości binarnej dla klucza, ale przepływy danych obsługują tylko klucze ciągów UTF-8. Przykład: $metadata.header.priority. Ta funkcja jest podobna do właściwości użytkownika.
Pole Opis
$metadata.topic Temat MQTT komunikatu
$metadata.user_property.<key> Właściwość użytkownika w komunikacie zidentyfikowana przez klucz
$metadata.system_property.content_type Właściwość systemowa typu zawartości
$metadata.header.<key> Wartość nagłówka platformy Kafka zidentyfikowana przez klucz

Odczyt z metadanych

Aby odwołać się do tematu źródłowego i właściwości użytkownika w wyrażeniu, wyświetl je jako dane wejściowe:

Dane wejściowe Variable
$metadata.topic $1
$metadata.user_property.device_id $2

Wyrażenie: $1 + "/" + $2

W poniższym przykładzie właściwość MQTT topic jest mapowana do pola origin_topic w danych wyjściowych.

Dane wejściowe Wynik
$metadata.topic origin_topic

Jeśli właściwość priority użytkownika znajduje się w komunikacie MQTT, w poniższym przykładzie pokazano, jak mapować ją na pole wyjściowe:

Dane wejściowe Wynik
$metadata.user_property.priority priority

Zapisywanie w metadanych

Aby ustawić właściwość użytkownika w komunikacie wyjściowym, użyj $metadata.user_property.<key> jako pola wyjściowego.

Ustawienie pola metadanych na wartość pustą (()) powoduje jego usunięcie. W przypadku właściwości użytkownika dozwolone są zduplikowane klucze.

Właściwości metadanych można również mapować na nagłówek danych wyjściowych lub właściwość użytkownika. W poniższym przykładzie MQTT topic jest mapowany na pole origin_topic we właściwości użytkownika wyniku.

Dane wejściowe Wynik
$metadata.topic $metadata.user_property.origin_topic

Jeśli przychodzący ładunek zawiera priority pole, w poniższym przykładzie pokazano, jak mapować go na właściwość użytkownika MQTT:

Dane wejściowe Wynik
priority $metadata.user_property.priority

Ten sam przykład dla platformy Kafka:

Dane wejściowe Wynik
priority $metadata.header.priority

Pola metadanych są obsługiwane w regułach mapowania, filtrowania i gałęzi. Nie są one dostępne w regułach okna (akumulacja).

Ostatnia znana wartość

Użyj sufiksu ? $last danych wejściowych, aby poinformować środowisko uruchomieniowe o zapamiętaniu najnowszej wartości dla tego pola. Jeśli w bieżącym komunikacie brakuje pola, zostanie użyta ostatnia znana wartość.

Dane wejściowe Zachowanie
temperature ? $last Używa ostatniej znanej temperatury, jeśli bieżący komunikat nie temperature ma pola

Dyrektywa ? $last nie uwzględnia wielkości liter i obsługuje elastyczne odstępy.

Ważna

Ostatnie znane wartości są przechowywane tylko w pamięci. Zostaną one utracone po ponownym uruchomieniu zasobnika i nie są współużytkowane przez repliki.

Ostatnia znana wartość jest obsługiwana w regułach mapowania, filtrowania i gałęzi. Nie jest ona dostępna w regułach okna (akumulacja).

Wartości domyślne

Użyj sufiksu ?? <default> danych wejściowych, aby podać wartość rezerwową, gdy brakuje pola. Obsługiwane typy domyślne: liczba całkowita, zmiennoprzecinkowa, wartość logiczna, ciąg i wartość null.

Uwaga / Notatka

Składnia ?? <default> jest dostępna tylko w grafach przepływu danych. Nie jest obsługiwana w danych wejściowych przepływu builtInTransformation danych.

Dane wejściowe Awaryjna opcja
temperature ?? 0 Liczba całkowita 0
status ?? "unknown" Ciąg "nieznany"
threshold ?? 98.6 Zmiennoprzecinkowy 98.6
enabled ?? true Wartość logiczna true

Łączenie ostatniej znanej wartości i wartości domyślnej

Możesz połączyć ? $last elementy i ?? <default>. Środowisko uruchomieniowe najpierw sprawdza bieżący komunikat, a następnie ostatnią znaną wartość, a następnie wartość domyślną. Jeśli używasz ?? <default> polecenia bez ? $last, środowisko uruchomieniowe sprawdza bieżący komunikat, a następnie jest to ustawienie domyślne bezpośrednio.

Dane wejściowe Kolejność oceny
temperature ?? 0 Bieżąca wartość, a następnie domyślna (0)
temperature ? $last ?? 0 Bieżąca wartość, a następnie ostatnia znana, a następnie domyślna (0)

Wartości domyślne są obsługiwane w regułach mapowania, filtrowania i gałęzi. Nie są one dostępne w regułach okna (akumulacja).

Typy danych

Typ Opis Przykład
int 64-bitowa liczba całkowita ze znakiem "+" lub "-" 42, -7
Zmiennoprzecinkowy 64-bitowy zmiennoprzecinkowa 3.14, -0.5
Sznurek Tekst UTF-8 "hello"
Bool logiczny true, false
Krotki Tablica wartości pierwotnych (1, 2, 3)
Pusty Brak lub wartość null ()
JSON Przekazany obiekt JSON (nie można używać w wyrażeniach)

Obiekty i tablice JSON są zachowywane as-is podczas kopiowania pól bez wyrażenia, ale nie można ich używać jako danych wejściowych do oceny wyrażeń.

Obsługa funkcji według typu przekształcenia

Ten sam język wyrażeń działa na transformacjach, ale wynik wyrażenia oznacza coś innego w każdej z nich:

Przekształć Co robi wyrażenie
Map Generuje wartość zapisaną do output
Filtr Gdy jest to prawda, wiadomość jest porzucana. Aby zachować dopasowanie wiadomości, odwróć wyrażenie.
Branch Kieruje wiadomość na ścieżkę true lub false (or path). Nic nie zostało porzucone.
Okno (skumulowane) Generuje wartość zagregowaną dla okna
Funkcja Map Filtr Branch Okno (skumulowane)
Zmienne pozycyjne Yes Yes Yes Yes
Operatorów Yes Yes Yes Yes
Wbudowane funkcje Yes Yes Yes Yes
Funkcje agregacji Nie. Nie. Nie. Yes
$metadata Dostęp Yes Yes Yes Nie.
$context Wzbogacania Yes Yes Yes Nie.
? $last Yes Yes Yes Nie.
?? <default> ¹ Yes Yes Yes Nie.
str::regex_matches / str::regex_replace ¹ Yes Yes Yes Nie.
Symbole wieloznaczne Yes Nie. Nie. Nie.

¹ Dostępne tylko w wykresach przepływu danych. Nieobsługiwane w danych wejściowych przepływu builtInTransformation danych.

Notacja kropkowa i ucieczka

Notacja kropkowa jest powszechnie używana do odwołowywania się do zagnieżdżonych pól. Standardowa ścieżka notacji kropkowej wygląda następująco: Person.Address.Street.Number.

W przepływie danych ścieżka opisana przez notację kropkową może zawierać ciągi i niektóre znaki specjalne bez konieczności ucieczki, takich jak Person.Date of Birth.

W innych przypadkach ucieczka jest niezbędna, na przykład: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Ta ścieżka, między innymi znakami specjalnymi, zawiera kropki w nazwie pola. Bez ucieczki nazwa pola będzie służyć jako separator w notacji kropkowej.

Przepływ danych analizuje ścieżkę, ale traktuje tylko dwa znaki jako specjalne:

  • Kropki (.) działają jako separatory pól.
  • Podwójne cudzysłowy, umieszczone na początku lub końcu segmentu, rozpoczynają sekcję z ucieczką, gdzie kropki nie są traktowane jako separatory pól.

Wszystkie inne znaki są traktowane jako część nazwy pola. Ta elastyczność jest przydatna w formatach, takich jak JSON, gdzie nazwy pól mogą być dowolnymi ciągami.

Definicja ścieżki musi być również zgodna z regułami formatu konfiguracji. Gdy znak ze specjalnym znaczeniem jest zawarty w ścieżce, wymagane jest prawidłowe cudzysłów. Na przykład nazwy pól rozpoczynające się dwukropkiem (na :Person:.:name:przykład ) lub rozpoczynające się od liczby, po której następuje tekst (na przykład 100 celsius.hot), muszą być poprawnie interpretowane jako ciągi.

Ucieczki

Podstawową funkcją ucieczki w ścieżce kropkowanej jest zastosowanie kropek, które są częścią nazw pól, a nie separatorów. Na przykład ścieżka Payload."Tag.10".Value składa się z trzech segmentów: Payload, Tag.10i Value. Znaki podwójnego cudzysłowu Tag.10 wokół uniemożliwiają działanie kropki jako separatora.

Ucieczka reguł w notacji kropkowej

  • Każdy segment potraktować oddzielnie: jeśli wiele segmentów zawiera znaki interpunkcyjne, te segmenty muszą być ujęte w podwójny cudzysłów. Można również cytować inne segmenty, ale nie ma to wpływu na interpretację ścieżki. Przykład: Payload."Tag.10".Measurements."Vibration.$12".Value

  • Cytuj fragment tylko wtedy, gdy trzeba się z niego uwolnić. Podwójne cudzysłowy wokół segmentu należy dodawać tylko wtedy, gdy zawiera kropkę (lub inny znak, który w przeciwnym razie byłby błędnie odczytany jako separator). Nie cytuj zwykłej nazwy pola.

    Na przykład, dla pola nazwanego TagName wewnątrz Records:

    Wykonaj to Nie to
    Records.TagName Records."TagName"

    Dodatkowe cudzysłowy nie pomagają, a w niektórych narzędziach, takich jak edytor przepływu danych Operations Experience, stają się one częścią nazwy pola. Mapowanie szuka wtedy pola o nazwie "TagName" (z cudzysłowami), które nie istnieje, więc nic się nie zgadza. Można to zauważyć w definicji przepływu eksportowanych danych, gdzie nazwa pojawia się z cudzysłowami z ucieczki, np \"TagName\". . Aby to naprawić, usuń cudzysłów, tak aby nazwa to po prostu TagName.

  • Prawidłowe użycie podwójnych cudzysłowów: podwójny cudzysłów musi otwierać i zamykać segment ucieczki. Wszelkie cudzysłów w środku segmentu są traktowane jako część nazwy pola. Na przykład ścieżka Payload.He said: "Hello", and waved definiuje dwa pola: Payload i He said: "Hello", and waved. Gdy kropka pojawi się w tych okolicznościach, nadal służy jako separator. Na przykład ścieżka Payload.He said: "No. It is done" jest podzielona na segmenty Payload, He said: "Noi It is done" (począwszy od spacji).

Algorytm segmentacji

  • Jeśli pierwszy znak segmentu jest znakiem cudzysłowu, analizator wyszukuje następny cudzysłów. Ciąg ujęty między tymi cudzysłowami jest traktowany jako pojedynczy segment.
  • Jeśli segment nie zaczyna się od cudzysłowu, analizator identyfikuje segmenty, wyszukując następną kropkę lub koniec ścieżki.

Symbole wieloznaczne

Użyj symbolu wieloznakowego (*) w ścieżkach wejściowych i wyjściowych, aby dopasować wiele pól jednocześnie. Jest to przydatne, gdy dane wyjściowe są dokładnie podobne do danych wejściowych lub gdy trzeba zastosować tę samą transformację w wielu polach bez wyświetlania listy każdego z nich.

Ważna

Przykłady dzikich kart w tej sekcji przechodzą przez pola zawarte w wejściu. Dla MQTT, Kafka i innych wyjść JSON to jest w porządku. Dla miejsca przechowywania z serializacją Parquet lub Delta, schemat wyjściowy musi deklarować każdy liść, do którego rozszerza się karta dzika. Jeśli ładunek w czasie wykonywania zawiera pole, którego schemat nie deklaruje, rekord zostaje usunięty. Wygeneruj schemat na podstawie reprezentatywnych danych próbnych i zobacz zachowanie serializacji pamięci masowej.

Kopiowanie wszystkich pól

Aby przekazać każde pole bez zmian:

Dane wejściowe Wynik
* *

Dopasuj * każdą ścieżkę pola do danych wejściowych i umieszcza ją w tej samej ścieżce w danych wyjściowych. Część pasujących ścieżek * jest nazywana przechwyconym segmentem. W danych wyjściowych przechwycony segment zastępuje element *.

Spłaszczane pola zagnieżdżone

Aby przenieść pola z zagnieżdżonego obiektu do poziomu głównego, umieść prefiks w danych wejściowych i * w danych wyjściowych:

Dane wejściowe Wynik
Sensors.* *
Metadata.* *

Biorąc pod uwagę te dane wejściowe:

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

Dane wyjściowe spłaszczają oba obiekty:

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

Przebuduj pola

Aby przenieść pola pod nowym elementem nadrzędnym, umieść * w danych wejściowych i dodaj prefiks w danych wyjściowych:

Dane wejściowe Wynik
* Telemetry.*

To opakowuje wszystkie pola najwyższego Telemetry poziomu wewnątrz obiektu.

Reguły umieszczania symboli wieloznacznych

  • Tylko jedna* jest dozwolona dla ścieżki wejściowej lub wyjściowej.
  • Element * musi być zgodny z kompletnym segmentem (a nie segmentem częściowym, np Sensor*. ).
  • Element * może pojawić się na początku (*.Value), środkowym (Sensors.*.Reading) lub na końcuSensors.* () ścieżki.

Symbole wieloznaczne z wieloma wejściami

Jeśli reguła ma wiele danych wejściowych z symbolami wieloznacznymi, * element musi przechwytywać ten sam segment we wszystkich danych wejściowych. Środowisko uruchomieniowe rozpoznaje element * z pierwszych danych wejściowych, a następnie wyszukuje pasujące ścieżki w innych danych wejściowych.

Aby na przykład średnią maksymalną i minimalną liczbę odczytów dla każdego czujnika:

Dane wejściowe Wynik Wyrażenie
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2

Biorąc pod uwagę te dane wejściowe:

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

Najpierw przechwytuje * element , więc reguła Temperature szuka wartości i Temperature.MaxTemperature.Min. Następnie przechwytuje Pressure i szuka Pressure.Max i Pressure.Min. Dane wyjściowe to:

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

Jeśli jakiekolwiek dane wejściowe nie mogą rozpoznać przechwyconego segmentu (na przykład *.Mid.Avg gdy pole jest zagnieżdżone inaczej), ten segment jest pomijany. Upewnij się, że ścieżki we wszystkich danych wejściowych odzwierciedlają rzeczywistą strukturę danych.

Zastąpij symbol wieloznaczny dla określonych pól

Możesz połączyć regułę z symbolami wieloznacznymi z określonymi regułami. Określone reguły mają pierwszeństwo, gdy mają niższe pokrycie (mniej segmentów dopasowanych przez *element ). Jest to nazywane specjalizacją.

Dane wejściowe Wynik Wyrażenie
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2
Pressure.Max ($1)
Pressure.Min ($2)
Averaged.PressureAdj ($1 + $2 + 1.0) / 2

Pierwsza reguła dotyczy wszystkich pól. Druga reguła zastępuje ją tylko, Pressure ponieważ Pressure.Max jest bardziej szczegółowa niż *.Max (pokrycie 0 a pokrycie 1).

Aby całkowicie wykluczyć pole, użyj pustych danych wyjściowych:

Dane wejściowe Wynik
Pressure.Max, Pressure.Min (puste)

Puste dane wyjściowe pomiń pole z wyniku. Spowoduje to zastąpienie dowolnej reguły z symbolami wieloznacznymi, która w przeciwnym razie będzie ją uwzględniać.

Wiele reguł dotyczących tych samych danych wejściowych

Jeśli dwie reguły mają takie samo lub wyższe pokrycie, oba mają zastosowanie. Dzięki temu można obliczyć wiele wartości pochodnych z tych samych danych wejściowych:

Dane wejściowe Wynik Wyrażenie
*.Max ($1)
*.Min ($2)
Stats.*.Avg ($1 + $2) / 2
*.Max ($1)
*.Min ($2)
Stats.*.Range $1 - $2

Obie reguły są wykonywane dla każdego przechwyconego segmentu, tworząc dwa pola wyjściowe na czujnik.

Symbole wieloznaczne w zestawach danych kontekstowych

Możesz użyć symboli wieloznacznych z $context odwołaniami, aby skopiować wszystkie pola z zestawu danych:

Dane wejściowe Wynik
$context(assetMeta).* Asset.*

Spowoduje to skopiowanie każdego pola z assetMeta zestawu danych do Asset sekcji danych wyjściowych.

Zestawy danych kontekstowych

Zestawy danych kontekstowych umożliwiają mapowanie integrowania dodatkowych danych z zewnętrznych baz danych. Użyj prefiksu $context(datasetName) , aby odwołać się do pól z zestawu danych. Na przykład $context(position).BaseSalary odczytuje BaseSalary pole z zestawu danych o nazwie position.

Aby uzyskać szczegółowe informacje na temat konfigurowania zestawów danych kontekstowych, zobacz Wzbogacanie danych przy użyciu przepływów danych i Wzbogacanie o dane zewnętrzne na wykresach przepływu danych.

Jeśli przyszedłeś tutaj szukając składni użytej w konkretnej transformacji, te artykuły pokazują wyrażenia w kontekście:

Aby to zrobić Zobacz
Przemianuj, restrukturyzuj lub obliczaj pola, w tym konwersje jednostek takich jak cToF Przekształcanie danych za pomocą mapy na wykresach przepływu danych
Porzuć wiadomości lub kieruj je różnymi ścieżkami z określonym warunkiem Filtrowanie i kierowanie danych na wykresach przepływu danych
Obliczaj uśredniająca, sumuje lub liczy w określonym oknie czasowym Agregowanie danych w czasie
Sprawdź dane referencyjne z magazynu stanowego Wzbogacanie przy użyciu danych zewnętrznych
Ustaw temat wyjściowy MQTT na podstawie treści wiadomości Kierowanie komunikatów do różnych tematów
Zbuduj potok zawierający te transformacje Przetwarzanie danych z grafami przepływu danych

Dla przepływów danych zobacz Mapowanie danych poprzez wykorzystanie przepływów danych oraz Filtrowanie danych w przepływie danych.