Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
- Data i godzina z przesunięciem liczbowym. Funkcja honoruje przesunięcie i normalizuje wynik do UTC.
- Data i godzina bez przesunięcia. Funkcja zakłada UTC.
- 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.priorityodwoł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".ValueCytuj 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
TagNamewewnątrzRecords:Wykonaj to Nie to Records.TagNameRecords."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 prostuTagName.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 waveddefiniuje dwa pola:PayloadiHe said: "Hello", and waved. Gdy kropka pojawi się w tych okolicznościach, nadal służy jako separator. Na przykład ścieżkaPayload.He said: "No. It is done"jest podzielona na segmentyPayload,He said: "NoiIt 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, npSensor*. ). - 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.
Treści powiązane
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.