Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Deze verwijzing is van toepassing op zowel gegevensstromen als gegevensstroomgrafieken. Beide gebruiken dezelfde expressietaal voor transformaties voor kaart-, filter- en verrijkingstransformaties. Gegevensstroomgrafieken ondersteunen ook vertakkings- en venstertransformaties (cumulatief), die waar van toepassing worden vermeld.
Positionele variabelen
De matrix van inputs elke regel bepaalt de variabelen die beschikbaar zijn in de expression. De eerste invoer wordt $1, de tweede wordt $2, enzovoort.
| Invoer | Expression | Resultaat |
|---|---|---|
Position, Office |
$1 + ", " + $2 |
Voegt positie en Office samen met een komma |
temperature |
cToF($1) |
Converteert Celsius naar Fahrenheit |
temperature, humidity |
$1 * $2 < 100000 |
Hiermee wordt een drempelwaarde gecontroleerd op twee velden |
Als er slechts één invoer is opgegeven en er geen expressie wordt opgegeven, wordt de waarde bij die invoer rechtstreeks naar de uitvoer gekopieerd.
Bedieners
Expressies bieden ondersteuning voor de volgende operators, die worden weergegeven van hoogste naar laagste prioriteit:
| Precedence | Bedieners | Beschrijving |
|---|---|---|
| 1 | ! |
Logische NOT (unaire) |
| 2 | ^ |
Exponentiatie |
| 3 |
*, , /% |
Vermenigvuldiging, deling, modulo |
| 4 |
+, - |
Optellen/tekenreekssamenvoeging, aftrekken |
| 5 |
<,>,<=,>= |
Comparison |
| 6 |
==, != |
Gelijkheid, ongelijkheid |
| 7 | && |
Logische AND |
| 8 | \|\| |
Logische OR |
De + operator voegt tekenreeksen samen wanneer ten minste één operand een tekenreeks is. Gebruik haakjes om de standaardprioriteit te overschrijven.
Belangrijk
Gebruik de symbolische logische operatoren && (EN), || (OF) en ! (NIET). De trefwoordvormen and, or, en not worden niet ondersteund. Schrijf bijvoorbeeld $1 == "a" || $1 == "b" in plaats van $1 == "a" or $1 == "b".
Voorbeelden:
| Expression | Beschrijving |
|---|---|
$1 * 2 ^ 3 |
Exponentiatie eerst: $1 * 8 |
($1 * 2) ^ 3 |
Haakjes overschrijven: eerst vermenigvuldigen |
-$1 * 2 |
Eerst negatie en vervolgens vermenigvuldigen |
$1 > 100 && $2 > 200 |
Ketenvoorwaarden met logische AND |
Ingebouwde functies
Functies voor eenheidsconversie
Deze functies accepteren één numerieke waarde en retourneren een float.
| Function | Conversie | Formula |
|---|---|---|
cToF(value) |
Celsius tot Fahrenheit | F = (C × 9/5) + 32 |
fToC(value) |
Fahrenheit naar Celsius | C = (F - 32) × 5/9 |
psiToBar(value) |
PSI naar staaf | bar = PSI × 0,0689476 |
barToPsi(value) |
Staaf naar PSI | PSI = staaf / 0,0689476 |
inToCm(value) |
Inches tot centimeters | cm = in × 2,54 |
cmToIn(value) |
Centimeters tot inch | in = cm / 2,54 |
ftToM(value) |
Voet naar meter | m = ft × 0,3048 |
mToFt(value) |
Meter tot voet | ft = m / 0,3048 |
lbToKg(value) |
Pond naar kilogram | kg = lb × 0,453592 |
kgToLb(value) |
Kilogram tot ponden | lb = kg / 0,453592 |
galToL(value) |
Us gallons to liter | L = gal × 3,78541 |
lToGal(value) |
Liter naar AMERIKAANSE gallons | gal = L / 3,78541 |
Functies schalen en afronden
| Function | Beschrijving |
|---|---|
scale(value, srcLo, srcHi, dstLo, dstHi) |
Schaalt value lineair van het bronbereik naar het doelbereik. Alle vijf argumenten moeten numeriek zijn. |
round_n(value, decimals) |
Rondt een float af op het opgegeven aantal decimalen (0 tot 15). |
Wiskundige functies
Deze functies zijn afkomstig uit de ingebouwde wiskundige bibliotheek.
| Function | Beschrijving |
|---|---|
floor(value) |
Grootste geheel getal kleiner dan of gelijk aan een getal |
round(value) |
Dichtstbijzijnde gehele waarde, halve richtingen afronden van 0,0 |
ceil(value) |
Kleinste gehele getal groter dan of gelijk aan een getal |
math::abs(value) |
Absolute waarde |
math::sqrt(value) |
Vierkantswortel (retourneert NaN voor negatieve getallen) |
math::cbrt(value) |
Kubushoofdmap |
math::ln(value) |
Natuurlijke logaritme |
math::log2(value) |
Logaritme met grondtal 2 |
math::log10(value) |
Logaritme met grondtal 10 |
math::log(value, base) |
Logaritme met willekeurige basis |
math::exp(value) |
e verheven tot de macht van waarde |
math::exp2(value) |
2 verheven tot de macht van waarde |
math::pow(base, exp) |
Verhoogt de basis tot de kracht van exp |
math::cos(value) |
Cosinus (radialen) |
math::sin(value) |
Sinus (radialen) |
math::tan(value) |
Tangens (radialen) |
math::acos(value) |
Arccosinus (retourneert radialen) |
math::asin(value) |
Arcsinus (retourneert radialen) |
math::atan(value) |
Arctangens (retourneert radialen) |
math::atan2(y, x) |
Vier kwadrant arctangens (retourneert radialen) |
math::hypot(a, b) |
Lengte van de hypotenuse van zijkanten a en b |
Stringfuncties
| Function | Beschrijving |
|---|---|
len(string) |
Tekenlengte van een tekenreeks of het aantal elementen van een tuple |
str::to_lowercase(string) |
Converteert naar kleine letters |
str::to_uppercase(string) |
Converteert naar hoofdletters |
str::trim(string) |
Hiermee verwijdert u voorloop- en volgspaties |
str::from(value) |
Converteert een waarde naar de tekenreeksweergave |
str::substring(string, start, end) |
Extraheert een subtekenreeks op tekenindex |
str::regex_matches(string, pattern) |
Retourneert true als de tekenreeks overeenkomt met het regex-patroon. Alleen beschikbaar in gegevensstroomgrafieken. |
str::regex_replace(string, pattern, replacement) |
Vervangt alle regex-overeenkomsten door de vervangende tekenreeks. Alleen beschikbaar in gegevensstroomgrafieken. |
Datum- en tijdfuncties
Datum- en tijdfuncties zijn alleen beschikbaar in datastroomgrafieken. Behalve voor parse_timestampvereisen functies die een tijdstempel accepteren een RFC 3339-string . De string moet een expliciete offset bevatten ten opzichte van de gecoördineerde universele tijd (UTC), zoals 2026-06-17T12:00:00Z of 2026-06-17T12:00:00-08:00. De Returns kolom vermeldt het conceptuele resultaattype, dat typeof in kleine letters "float"als , "int", of "string"wordt gerapporteerd.
| Function | Retouren | Beschrijving |
|---|---|---|
duration_between(start, end, unit) |
float |
Berekent end - start met millisecondenprecisie. Ondersteunde eenheden zijn "seconds", "millis", "minutes", "hours", en "days". Verschillen van minder dan één milliseconde geven een terugkering 0. Het resultaat is negatief wanneer end minstens één milliseconde voor startis. |
day_of_week(timestamp) |
int |
Komt terug op de dag van de week, waar zondag is 0 en zaterdag 6. |
hour_of_day(timestamp) |
int |
Geeft het uur terug van 0 tot en met 23. |
year_of(timestamp) |
int |
Geeft het kalenderjaar terug. |
month_of(timestamp) |
int |
Retourneert de maand van 1 tot en met 12. |
day_of_month(timestamp) |
int |
Geeft de dag van de maand terug van 1 tot en met 31. |
minute_of_hour(timestamp) |
int |
Geeft de minuut terug van 0 tot 59. |
second_of_minute(timestamp) |
int |
Geeft de tweede terug van 0 door .59 |
timezone_offset(timestamp) |
int |
Geeft de tijdstempel van de offset van UTC binnen enkele minuten terug. Bijvoorbeeld, -08:00 retourneert -480 en +05:30 retourneert 330. |
now() |
string |
Geeft de huidige UTC-tijd terug als een RFC 3339-tijdstempel met millisecondenprecisie. |
format_timestamp(timestamp, pattern) |
string |
Formateert een RFC 3339-tijdstempel door gebruik te maken van een strftime patroon. |
parse_timestamp(value, pattern) |
string |
Een waarde wordt ontleed met behulp van een strftime patroon en geeft een RFC 3339 UTC-tijdstempel met millisecondenprecisie terug. |
from_epoch(value, unit) |
string |
Zet een Unix-epochwaarde om in een RFC 3339 UTC-tijdstempel met millisecondenprecisie. Ondersteunde eenheden zijn "seconds", "millis", en "micros". De waarde kan een int of floatzijn. |
to_epoch(timestamp, unit) |
int |
Zet een RFC 3339-tijdstempel om in een Unix-epoch-geheel getal. Ondersteunde eenheden zijn "seconds", "millis", en "micros". |
now() leest de systeemklok van de Kubernetes-node die de dataflow-werklast host elke keer dat de functie wordt uitgevoerd. Aanroepen in dezelfde expressie kunnen verschillende waarden teruggeven. In een accumulatieregel now() wordt de tijd teruggegeven waarop het venster wordt verwerkt, niet wanneer een invoerbericht arriveert. Om klokverschuiving tussen clusterknopen te verminderen, synchroniseer elke knoopklok met een betrouwbare tijdbron, zoals een Network Time Protocol-server.
Kalender- en klokfuncties, zoals day_of_week, hour_of_day, en year_of, gebruiken de offset in de invoertijdstempel. Ze zetten de waarde niet eerst om naar UTC. De volgende voorbeelden tonen dit gedrag.
| Expression | Resultaat |
|---|---|
hour_of_day("2026-06-17T23:30:45-08:00") |
23 |
day_of_week("2026-06-17T23:30:45-08:00") |
3 (Woensdag) |
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 |
Formaat en parse tijdstempels
De format_timestamp en parse_timestamp functies gebruiken strftime patronen. De volgende tabel geeft een overzicht van veelvoorkomende specificaties.
| Specificator | Value |
|---|---|
%Y |
Jaartal van vier cijfers |
%m |
Maand met twee cijfers |
%d |
Tweecijferige dag van de maand |
%H |
Uur in 24-uursnotatie |
%M |
Minuut |
%S |
Tweede |
%f |
Nanoseconden sinds de laatste hele seconde, zonder een decimaal punt |
%.f |
Fractieseconden, inclusief het decimale punt |
%z |
Numerieke UTC-offset, zoals +0200 |
%:z |
Numerieke UTC-offset met een dubbele punt, zoals +02:00 |
Voor alle ondersteunde specificaties, zie de Chrono strftime-documentatie.
format_timestamp behoudt de offset van de invoertijdstempel. Bijvoorbeeld, format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") retourneert "2026-06-09 14:00 +02:00".
parse_timestamp Verwerkt de invoer in de volgende volgorde:
- Een datum en tijd met een numerieke verschuiving. De functie respecteert de offset en normaliseert het resultaat naar UTC.
- Een datum en tijd zonder afstemming. De functie gaat uit van UTC.
- Een date zonder tijd. De functie gaat uit van middernacht UTC.
De volgende voorbeelden laten zien hoe parse_timestamp elk type invoer wordt behandeld.
| Expression | Resultaat |
|---|---|
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" |
Belangrijk
parse_timestamp ondersteunt geen tijds-only waarden of tijdzone-afkortingen zoals PST. Gebruik %z of %:z met een numerieke offset in plaats van %Z. Parsing normaliseert tijdstempels naar UTC, maar de opmaak behoudt de inputoffset. Daarom zijn de twee functies geen exacte inversen voor waarden die een niet-nul offset bevatten.
Converteer Unix-epochwaarden
Gebruik from_epoch en to_epoch om te converteren tussen Unix-epochwaarden en RFC 3339-tijdstempels.
| Expression | Resultaat |
|---|---|
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 accepteert negatieve waarden voor data vóór 1 januari 1970. De output heeft millisecondenprecisie, dus het omzetten van epoch-microseconden naar een tijdstempel betekent dat de precisie onder één milliseconde blijft.
to_epoch houdt rekening met de UTC-offset van de tijdstempel en rondt waarden vóór 1970 af naar het volgende lagere geheel getal voor de geselecteerde eenheid.
Datum- en tijdsfuncties kunnen worden samengesteld. Berekent duration_between($1, now(), "days") bijvoorbeeld de leeftijd in dagen van een RFC 3339-tijdstempel die als eerste regelinvoer wordt opgegeven. Om het uur van een tijdstempel na het omzetten naar UTC te lezen, gebruik hour_of_day(from_epoch(to_epoch($1, "micros"), "micros")).
Functies voor voorwaardelijke en verzameling
| Function | Beschrijving |
|---|---|
if(condition, trueVal, falseVal) |
Retourneert trueVal wanneer de voorwaarde waar is, anders falseVal |
min(values) |
Minimaal een of meer numerieke waarden of een matrix |
max(values) |
Maximum van een of meer numerieke waarden of een matrix |
contains(tuple, value) |
Retourneert waar als de tuple de waarde bevat |
contains_any(tuple, candidates) |
Retourneert waar als de tuple een waarde van de kandidaten-tuple bevat |
typeof(value) |
Retourneert het type als een tekenreeks: "string", "float", "int", "boolean", of "tuple""empty" |
Aggregatiefuncties (alleen venstertransformaties)
Deze functies zijn alleen beschikbaar in accumulatieregels binnen venstertransformaties. Elke variabele heeft één positionele variabele.
| Function | Retouren | Gedrag van leeg venster |
|---|---|---|
average($n) |
Gemiddelde van numerieke waarden | Fout |
sum($n) |
Som van numerieke waarden | 0,0 |
min($n) |
Minimale numerieke waarde | Fout |
max($n) |
Maximumaantal numerieke waarden | Fout |
count($n) |
Aantal berichten waarin het veld bestaat | 0 |
first($n) |
Eerste waarde in het venster | Fout |
last($n) |
Laatste waarde in het venster | Fout |
Zie Statistische gegevens in de loop van de tijd voor meer informatie over het gebruik van aggregatiefuncties.
Voorwaardelijke logica
Gebruik de if functie om logica te vertakken binnen een expressie:
| Expression | Beschrijving |
|---|---|
if($1 > 100, "high", "normal") |
Geeft als resultaat 'hoog' wanneer de temperatuur hoger is dan 100 |
if($2 == (), $1, $1 * $2) |
Valt terug op $1 wanneer $2 ontbreekt |
if($1 > 5, true, false) |
Retourneert een Booleaanse waarde op basis van een drempelwaarde |
Gebruik () (de lege waarde) in vergelijkingen om ontbrekende velden te detecteren.
Aanbeveling
Als u alleen een statische terugval voor een ontbrekend veld nodig hebt, is de ?? <default> syntaxis eenvoudiger. Zie Standaardwaarden. Reserveer if voor gevallen waarin u moet kiezen tussen berekende waarden.
Metagegevensvelden
Lees van en schrijf naar berichtmetagegevens met behulp van het $metadata. voorvoegsel in de inputs of output velden van een regel. Metagegevensverwijzingen gaan naar het veldpad, niet in de expressie zelf.
Eigenschappen van metagegevens
-
Onderwerp: Werkt voor zowel MQTT als Kafka. Het bevat de tekenreeks waarin het bericht is gepubliceerd. Voorbeeld:
$metadata.topic. -
Gebruikerseigenschap: In MQTT verwijst dit naar de vrije sleutel/waardeparen die een MQTT-bericht kan bevatten. Als het MQTT-bericht bijvoorbeeld is gepubliceerd met een gebruikerseigenschap met de sleutel 'prioriteit' en de waarde 'hoog', bevat de
$metadata.user_property.priorityverwijzing de waarde 'hoog'. Gebruikerseigenschapssleutels kunnen willekeurige tekenreeksen zijn en er kunnen escape-tekens nodig zijn:$metadata.user_property."weird key"maakt gebruik van de sleutel 'rare sleutel' (met een spatie). -
Systeemeigenschap: Deze term wordt gebruikt voor elke eigenschap die geen gebruikerseigenschap is. Op dit moment wordt slechts één systeemeigenschap ondersteund:
$metadata.system_property.content_type, waarmee de eigenschap van het inhoudstype van het MQTT-bericht wordt gelezen (indien ingesteld). -
Header: Dit is het Kafka-equivalent van de MQTT-gebruikerseigenschap. Kafka kan elke binaire waarde voor een sleutel gebruiken, maar gegevensstromen ondersteunen alleen UTF-8-tekenreekssleutels. Voorbeeld:
$metadata.header.priority. Deze functionaliteit is vergelijkbaar met gebruikerseigenschappen.
| Veld | Beschrijving |
|---|---|
$metadata.topic |
Het MQTT-onderwerp van het bericht |
$metadata.user_property.<key> |
Een gebruikerseigenschap in het bericht, geïdentificeerd door de sleutel |
$metadata.system_property.content_type |
De systeemeigenschap van het inhoudstype |
$metadata.header.<key> |
Een Kafka-headerwaarde, geïdentificeerd door sleutel |
Lezen uit metagegevens
Als u wilt verwijzen naar het brononderwerp en een gebruikerseigenschap in een expressie, vermeldt u deze als invoer:
| Invoer | Variable |
|---|---|
$metadata.topic |
$1 |
$metadata.user_property.device_id |
$2 |
Uitdrukking: $1 + "/" + $2
In het volgende voorbeeld wordt de eigenschap MQTT topic toegewezen aan het origin_topic veld in de uitvoer:
| Invoer | Uitvoer |
|---|---|
$metadata.topic |
origin_topic |
Als de gebruikerseigenschap priority aanwezig is in het MQTT-bericht, ziet u in het volgende voorbeeld hoe u deze kunt toewijzen aan een uitvoerveld:
| Invoer | Uitvoer |
|---|---|
$metadata.user_property.priority |
priority |
Schrijven naar metagegevens
Als u een gebruikerseigenschap wilt instellen voor het uitvoerbericht, gebruikt $metadata.user_property.<key> u deze als uitvoerveld.
Als u een metagegevensveld instelt op een lege waarde (()) wordt dit verwijderd. Voor gebruikerseigenschappen zijn dubbele sleutels toegestaan.
U kunt metagegevenseigenschappen ook toewijzen aan een uitvoerheader of gebruikerseigenschap. In het volgende voorbeeld wordt de MQTT topic toegewezen aan het origin_topic veld in de gebruikerseigenschap van de uitvoer:
| Invoer | Uitvoer |
|---|---|
$metadata.topic |
$metadata.user_property.origin_topic |
Als de binnenkomende nettolading een priority veld bevat, ziet u in het volgende voorbeeld hoe u deze kunt toewijzen aan een MQTT-gebruikerseigenschap:
| Invoer | Uitvoer |
|---|---|
priority |
$metadata.user_property.priority |
Hetzelfde voorbeeld voor Kafka:
| Invoer | Uitvoer |
|---|---|
priority |
$metadata.header.priority |
Metagegevensvelden worden ondersteund in kaart-, filter- en vertakkingsregels. Ze zijn niet beschikbaar in regels voor vensters (accumulatie).
Laatst bekende waarde
Gebruik het ? $last achtervoegsel op een invoer om de runtime te vertellen dat de meest recente waarde voor dat veld moet worden onthouden. Als het veld ontbreekt in het huidige bericht, wordt in plaats daarvan de laatst bekende waarde gebruikt.
| Invoer | Gedrag |
|---|---|
temperature ? $last |
Gebruikt de laatst bekende temperatuur als het huidige bericht geen temperature veld heeft |
De ? $last richtlijn is niet hoofdlettergevoelig en ondersteunt flexibele witruimte.
Belangrijk
Laatst bekende waarden worden alleen in het geheugen opgeslagen. Ze gaan verloren wanneer de pod opnieuw wordt opgestart en niet worden gedeeld tussen replica's.
Laatst bekende waarde wordt ondersteund in kaart-, filter- en vertakkingsregels. Deze is niet beschikbaar in regels voor vensters (cumulatie).
Standaardwaarden
Gebruik het ?? <default> achtervoegsel op een invoer om een terugvalwaarde op te geven wanneer het veld ontbreekt. Ondersteunde standaardtypen: geheel getal, float, booleaanse waarde, tekenreeks en null.
Opmerking
De ?? <default> syntaxis is alleen beschikbaar in gegevensstroomgrafieken. Dit wordt niet ondersteund in invoer van gegevensstromen builtInTransformation .
| Invoer | Terugval |
|---|---|
temperature ?? 0 |
Geheel getal 0 |
status ?? "unknown" |
Tekenreeks "onbekend" |
threshold ?? 98.6 |
Vlot 98.6 |
enabled ?? true |
Booleaanse waarde waar |
Laatst bekende waarde en standaardwaarde combineren
U kunt combineren ? $last en ?? <default>. De runtime controleert eerst het huidige bericht, vervolgens de laatst bekende waarde en vervolgens de standaardwaarde. Als u ?? <default> zonder ? $lastgebruikt, controleert de runtime het huidige bericht en vervolgens de standaardwaarde rechtstreeks.
| Invoer | Evaluatievolgorde |
|---|---|
temperature ?? 0 |
Huidige waarde en vervolgens standaard (0) |
temperature ? $last ?? 0 |
Huidige waarde, vervolgens laatst bekend en vervolgens standaard (0) |
Standaardwaarden worden ondersteund in kaart-, filter- en vertakkingsregels. Ze zijn niet beschikbaar in regels voor vensters (accumulatie).
Gegevenstypen
| Typ | Beschrijving | Voorbeeld |
|---|---|---|
| Int | 64-bits ondertekende gehele getallen |
42, -7 |
| zweven | 64-bits drijvende komma |
3.14, -0.5 |
| Snaar / Touwtje | UTF-8-tekst | "hello" |
| Bool | Boolean |
true, false |
| Tupel | Matrix van primitieve waarden | (1, 2, 3) |
| Leeg | Ontbrekende of null-waarde | () |
| JSON | JSON-object doorgegeven via | (kan niet worden gebruikt in expressies) |
JSON-objecten en matrices blijven behouden as-is wanneer velden zonder expressie worden gekopieerd, maar ze kunnen niet worden gebruikt als invoer voor expressie-evaluatie.
Functieondersteuning per transformatietype
Dezelfde expressietaal werkt over transformaties, maar het resultaat van een uitdrukking betekent in elke transformatie iets anders:
| Transform | Wat het expressieresultaat doet |
|---|---|
| Kaart | Produceert de waarde geschreven naar output |
| Filter | Wanneer het waar is, wordt de boodschap weggelaten. Om berichten te blijven matchen, draai je de uitdrukking om. |
| Branch | Stuurt het bericht naar het true of pad false . Er wordt niets weggelaten. |
| Venster (cumulatie) | Produceert de geaggregeerde waarde voor het venster |
| Feature | Kaart | Filter | Branch | Venster (cumulatie) |
|---|---|---|---|---|
| Positionele variabelen | Ja | Ja | Ja | Ja |
| Bedieners | Ja | Ja | Ja | Ja |
| Ingebouwde functies | Ja | Ja | Ja | Ja |
| Aggregatiefuncties | No | No | No | Ja |
$metadata Toegang |
Ja | Ja | Ja | No |
$context Verrijking |
Ja | Ja | Ja | No |
? $last |
Ja | Ja | Ja | No |
?? <default> ¹ |
Ja | Ja | Ja | No |
str::regex_matches
/
str::regex_replace ¹ |
Ja | Ja | Ja | No |
| Jokertekens | Ja | No | No | No |
¹ Alleen beschikbaar in gegevensstroomgrafieken. Niet ondersteund in invoer van gegevensstromen builtInTransformation .
Punt notatie en escape
Punt notatie wordt veel gebruikt om te verwijzen naar geneste velden. Een standaardpad naar een punt-notatie ziet er als Person.Address.Street.Numbervolgt uit.
In een gegevensstroom kan een pad dat wordt beschreven door punt notatie tekenreeksen en een aantal speciale tekens bevatten zonder escapen te hoeven uitvoeren, zoals Person.Date of Birth.
In andere gevallen is ontsnappen nodig, bijvoorbeeld: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Dit pad bevat onder andere speciale tekens puntjes in de veldnaam. Zonder het gebruik van escape-karakters zou de veldnaam fungeren als scheidingsteken in de puntnotatie zelf.
Hoewel een gegevensstroom een pad parseert, worden er slechts twee tekens als speciaal behandeld:
- Puntjes (
.) fungeren als veldscheidingstekens. - Dubbele aanhalingstekens, wanneer ze aan het begin of einde van een segment worden geplaatst, beginnen een ontsnapt gedeelte waarbij stippen niet als veldverdeelers worden behandeld.
Alle andere tekens worden behandeld als onderdeel van de veldnaam. Deze flexibiliteit is handig in indelingen zoals JSON, waarbij veldnamen willekeurige tekenreeksen kunnen zijn.
De paddefinitie moet ook voldoen aan de regels van de configuratie-indeling. Wanneer een teken met speciale betekenis wordt opgenomen in het pad, is de juiste aanhaling vereist. Veldnamen die beginnen met een dubbele punt (zoals :Person:.:name:) of die beginnen met een getal gevolgd door tekst (zoals 100 celsius.hot) moeten bijvoorbeeld correct worden geïnterpreteerd als tekenreeksen in de configuratie.
Ontsnappen
De primaire functie van ontsnappen in een punt-noterend pad is om plaats te bieden aan het gebruik van puntjes die deel uitmaken van veldnamen in plaats van scheidingstekens. Het pad Payload."Tag.10".Value bestaat bijvoorbeeld uit drie segmenten: Payload, Tag.10en Value. De dubbele aanhalingstekens rond Tag.10 verhinderen dat de punt fungeert als scheidingsteken.
Regels ontsnappen in punt notatie
Ontsnap elk segment afzonderlijk: Als meerdere segmenten puntjes bevatten, moeten deze segmenten tussen dubbele aanhalingstekens worden geplaatst. Andere segmenten kunnen ook worden geciteerd, maar dit heeft geen invloed op de interpretatie van het pad. Bijvoorbeeld:
Payload."Tag.10".Measurements."Vibration.$12".ValueCiteer een segment alleen als het uit moet komen. Voeg dubbele aanhalingstekens toe rond een segment alleen wanneer het een punt bevat (of een ander teken dat anders als scheidingsteken zou worden gelezen). Citeer geen gewone veldnaam.
Bijvoorbeeld, voor een veld genaamd
TagNamebinnenRecords:Doe u het volgende Niet dit Records.TagNameRecords."TagName"De extra aanhalingstekens helpen niet, en in sommige tools, zoals de data flow editor voor operations experience, worden ze onderdeel van de veldnaam. De mapping zoekt vervolgens naar een veld met de naam
"TagName"(citaten inbegrepen), dat niet bestaat, dus niets komt overeen. Je kunt dit zien in de definitie van de geëxporteerde datastroom, waar de naam verschijnt met ontsnapte aanhalingstekens, zoals\"TagName\". Om het op te lossen, verwijder je de aanhalingstekens zodat de naam gewoonTagName.Correct gebruik van dubbele aanhalingstekens: Dubbele aanhalingstekens moeten een ontsnapt segment openen en sluiten. Alle aanhalingstekens in het midden van het segment worden beschouwd als onderdeel van de veldnaam. Het pad
Payload.He said: "Hello", and waveddefinieert bijvoorbeeld twee velden:PayloadenHe said: "Hello", and waved. Wanneer onder deze omstandigheden een punt wordt weergegeven, blijft deze fungeren als scheidingsteken. Het padPayload.He said: "No. It is done"wordt bijvoorbeeld gesplitst in de segmentenPayloadHe said: "NoenIt is done"(beginnend met een spatie).
Segmentatie-algoritme
- Als het eerste teken van een segment een aanhalingsteken is, zoekt de parser naar het volgende aanhalingsteken. De tekenreeks tussen deze aanhalingstekens wordt beschouwd als één segment.
- Als het segment niet begint met een aanhalingsteken, identificeert de parser segmenten door te zoeken naar de volgende punt of het einde van het pad.
Jokertekens
Gebruik een jokerteken (*) in invoer- en uitvoerpaden om meerdere velden tegelijk te vinden. Dit is handig wanneer de uitvoer lijkt op de invoer, of wanneer u dezelfde transformatie moet toepassen op veel velden zonder dat u elke transformatie hoeft weer te geven.
Belangrijk
De jokerkaartvoorbeelden in deze sectie gaan door de velden die de invoer bevat. Voor MQTT, Kafka en andere JSON-uitvoer is dit prima. Voor een opslagbestemming met Parquet- of Delta-serialisatie moet het uitvoerschema elk blad declareren waar de wildcard naar uitbreidt. Als de runtime payload een veld bevat dat het schema niet declareert, wordt het record verwijderd. Genereer het schema uit representatieve steekproefgegevens en bekijk het gedrag van Storage serialization.
Alle velden kopiëren
Als u elk veld ongewijzigd wilt doorgeven:
| Invoer | Uitvoer |
|---|---|
* |
* |
Het * komt overeen met elk veldpad in de invoer en plaatst het op hetzelfde pad in de uitvoer. Het gedeelte van het pad dat * overeenkomt, wordt het vastgelegde segment genoemd. In de uitvoer vervangt het vastgelegde segment het *.
Geneste velden plat maken
Als u velden uit een genest object naar het hoofdniveau wilt verplaatsen, plaatst u het voorvoegsel in de invoer en * in de uitvoer:
| Invoer | Uitvoer |
|---|---|
Sensors.* |
* |
Metadata.* |
* |
Op basis van deze invoer:
{
"Sensors": { "Temperature": 72.5, "Pressure": 14.7 },
"Metadata": { "LineId": "Line-3", "Shift": "A" }
}
Met de uitvoer worden beide objecten platgemaakt:
{
"Temperature": 72.5,
"Pressure": 14.7,
"LineId": "Line-3",
"Shift": "A"
}
Velden opnieuw structureren
Als u velden onder een nieuw bovenliggend item wilt verplaatsen, plaatst * u de invoer en voegt u een voorvoegsel toe aan de uitvoer:
| Invoer | Uitvoer |
|---|---|
* |
Telemetry.* |
Hiermee worden alle velden op het hoogste niveau in een Telemetry object verpakt.
Regels voor plaatsing van jokertekens
- Er is slechts één
*toegestaan per invoer- of uitvoerpad. - Het
*moet overeenkomen met een volledig segment (niet een gedeeltelijk segment zoalsSensor*). - De
*naam kan worden weergegeven aan het begin (*.Value), het midden (Sensors.*.Reading) of het einde (Sensors.*) van een pad.
Jokertekens voor meervoudige invoer
Wanneer een regel meerdere invoer met jokertekens heeft, moet het *hetzelfde segment voor alle invoergegevens vastleggen. De runtime lost de * eerste invoer op en zoekt vervolgens naar overeenkomende paden in de andere invoer.
Als u bijvoorbeeld de maximale en minimale metingen voor elke sensor wilt berekenen:
| Invoer | Uitvoer | Expression |
|---|---|---|
*.Max ($ 1)*.Min ($ 2) |
Averaged.* |
($1 + $2) / 2 |
Op basis van deze invoer:
{
"Temperature": { "Max": 85.3, "Min": 62.1 },
"Pressure": { "Max": 15.2, "Min": 14.1 }
}
De * opnamen Temperature eerst, dus de regel zoekt naar zowel als Temperature.MaxTemperature.Min. Vervolgens wordt er vastgelegd Pressure en gezocht Pressure.Max naar en Pressure.Min. De uitvoer is:
{
"Averaged": { "Temperature": 73.7, "Pressure": 14.65 }
}
Als invoer niet kan worden omgezet voor een vastgelegd segment (bijvoorbeeld *.Mid.Avg wanneer het veld anders is genest), wordt dat segment overgeslagen. Zorg ervoor dat de paden in alle invoer de werkelijke structuur van de gegevens weerspiegelen.
Een jokerteken overschrijven voor specifieke velden
U kunt een jokertekenregel combineren met specifieke regels. Specifieke regels hebben voorrang wanneer ze een lagere dekking hebben (minder segmenten die overeenkomen met *). Dit wordt specialisatie genoemd.
| Invoer | Uitvoer | Expression |
|---|---|---|
*.Max ($ 1)*.Min ($ 2) |
Averaged.* |
($1 + $2) / 2 |
Pressure.Max ($ 1)Pressure.Min ($ 2) |
Averaged.PressureAdj |
($1 + $2 + 1.0) / 2 |
De eerste regel is van toepassing op alle velden. De tweede regel overschrijft deze alleen voor Pressure , omdat Pressure.Max deze specifieker is dan *.Max (dekking 0 versus dekking 1).
Als u een veld volledig wilt uitsluiten, gebruikt u een lege uitvoer:
| Invoer | Uitvoer |
|---|---|
Pressure.Max, Pressure.Min |
(leeg) |
Bij een lege uitvoer wordt het veld uit het resultaat verwijderd. Hiermee wordt een jokertekenregel overschreven die anders zou worden opgenomen.
Meerdere regels op dezelfde invoer
Als twee regels dezelfde of hogere dekking hebben, zijn beide van toepassing. Hiermee kunt u meerdere afgeleide waarden berekenen op basis van dezelfde invoer:
| Invoer | Uitvoer | Expression |
|---|---|---|
*.Max ($ 1)*.Min ($ 2) |
Stats.*.Avg |
($1 + $2) / 2 |
*.Max ($ 1)*.Min ($ 2) |
Stats.*.Range |
$1 - $2 |
Beide regels worden uitgevoerd voor elk vastgelegd segment, waardoor twee uitvoervelden per sensor worden geproduceerd.
Jokertekens in contextuele gegevenssets
U kunt jokertekens gebruiken met $context verwijzingen om alle velden uit een gegevensset te kopiëren:
| Invoer | Uitvoer |
|---|---|
$context(assetMeta).* |
Asset.* |
Hiermee kopieert u elk veld uit de assetMeta gegevensset naar de Asset sectie van de uitvoer.
Contextuele gegevenssets
Met contextuele gegevenssets kunnen toewijzingen extra gegevens uit externe databases integreren. Gebruik het $context(datasetName) voorvoegsel om te verwijzen naar velden uit een gegevensset. Leest bijvoorbeeld $context(position).BaseSalary het veld uit een gegevensset met de BaseSalary naam position.
Zie Gegevens verrijken met behulp van gegevensstromen en Verrijken met externe gegevens in gegevensstroomgrafieken voor meer informatie over het configureren van contextualisatiegegevenssets.
Verwante inhoud
Als je hier bent gekomen op zoek naar de syntaxis die in een specifieke transformatie wordt gebruikt, tonen deze artikelen expressies in context:
| Om dit te doen | Zien! |
|---|---|
Hernoem, herstructureren of bereken velden, inclusief eenheidsconversies zoals cToF |
Gegevens transformeren met toewijzing in gegevensstroomgrafieken |
| Stuur berichten of stuur ze via verschillende paden met een voorwaarde | Gegevens filteren en routeren in gegevensstroomgrafieken |
| Bereken gemiddelden, sommen of tellingen over een tijdsvenster | Gegevens in de loop van de tijd aggregeren |
| Zoek referentiegegevens op in de state store | Verrijken met externe gegevens |
| Stel het uitvoer MQTT-onderwerp in vanuit de berichtinhoud | Berichten routeren naar verschillende onderwerpen |
| Bouw de pijplijn die deze transformaties bevat | Procesgegevens met datastroomgrafieken |
Voor datastromen, zie Map data door data flows en filterdata in een dataflow te gebruiken.