Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här referensen gäller både dataflöden och dataflödesdiagram. Båda använder samma uttrycksspråk för map-, filter- och berikningstransformeringar. Dataflödesdiagram stöder även förgrenings- och fönstertransformeringar (ackumulerade), som noteras i förekommande fall.
Positionsvariabler
Varje regels inputs matris avgör vilka variabler som är tillgängliga i expression. Den första inmatningen blir $1, den andra blir $2, och så vidare.
| Ingångar | Uttryck | Result |
|---|---|---|
Position, Office |
$1 + ", " + $2 |
Sammanfogar position och Office med kommatecken |
temperature |
cToF($1) |
Konverterar Celsius till Fahrenheit |
temperature, humidity |
$1 * $2 < 100000 |
Kontrollerar ett tröskelvärde mot två fält |
Om endast en indata anges och inget uttryck anges kopieras värdet vid indata direkt till utdata.
Operatörer
Uttryck stöder följande operatorer, listade från högsta till lägsta prioritet:
| Precedence | Operatörer | Beskrivning |
|---|---|---|
| 1 | ! |
Logisk NOT (unary) |
| 2 | ^ |
Exponentiering |
| 3 |
*, , /% |
Multiplikation, division, modulo |
| 4 |
+, - |
Addition/strängsammanfogning, subtraktion |
| 5 |
<, >, , <=>= |
Jämförelse |
| 6 |
==, != |
Jämlikhet, ojämlikhet |
| 7 | && |
Logiskt OCH |
| 8 | \|\| |
Logiskt ELLER |
Operatorn + sammanfogar strängar när minst en operand är en sträng. Använd parenteser för att åsidosätta standardprioretens.
Viktigt!
Använd de symboliska logiska operatorerna && (OCH), || (ELLER) och ! (INTE). Nyckelordsformulären and, or, och not stöds inte. Skriv till exempel $1 == "a" || $1 == "b" i stället för $1 == "a" or $1 == "b".
Exempel:
| Uttryck | Beskrivning |
|---|---|
$1 * 2 ^ 3 |
Exponentiation först: $1 * 8 |
($1 * 2) ^ 3 |
Åsidosättning av parenteser: multiplicera först |
-$1 * 2 |
Negation först och multiplicera sedan |
$1 > 100 && $2 > 200 |
Kedjevillkor med logisk AND |
Inbyggda funktioner
Enhetskonverteringsfunktioner
Dessa funktioner accepterar ett enda numeriskt värde och returnerar ett flyttal.
| Function | Conversion | Formel |
|---|---|---|
cToF(value) |
Celsius till Fahrenheit | F = (C × 9/5) + 32 |
fToC(value) |
Fahrenheit till Celsius | C = (F - 32) × 5/9 |
psiToBar(value) |
PSI till stapel | bar = PSI × 0,0689476 |
barToPsi(value) |
Stapel till PSI | PSI = bar / 0,0689476 |
inToCm(value) |
Tum till centimeter | cm = i × 2,54 |
cmToIn(value) |
Centimeter till tum | i = cm / 2,54 |
ftToM(value) |
Fot till meter | m = ft × 0,3048 |
mToFt(value) |
Meter till fot | ft = m / 0,3048 |
lbToKg(value) |
Pund till kilo | kg = lb × 0,453592 |
kgToLb(value) |
Kilo till pund | lb = kg / 0,453592 |
galToL(value) |
Amerikanska gallon till liter | L = gal × 3,78541 |
lToGal(value) |
Liter till amerikanska gallon | gal = L / 3,78541 |
Skalnings- och avrundningsfunktioner
| Function | Beskrivning |
|---|---|
scale(value, srcLo, srcHi, dstLo, dstHi) |
Skalar value linjärt från källintervallet till målintervallet. Alla fem argumenten måste vara numeriska. |
round_n(value, decimals) |
Avrundar en flyttal till det angivna antalet decimaler (0 till 15). |
Matematiska funktioner
Dessa funktioner kommer från det inbyggda matematiska biblioteket.
| Function | Beskrivning |
|---|---|
floor(value) |
Största heltal som är mindre än eller lika med ett tal |
round(value) |
Närmaste heltal, avrundning halvvägs från 0,0 |
ceil(value) |
Minsta heltal större än eller lika med ett tal |
math::abs(value) |
Absolutvärdet |
math::sqrt(value) |
Kvadratrot (returnerar NaN för negativa tal) |
math::cbrt(value) |
Kubrot |
math::ln(value) |
Naturlig logaritm |
math::log2(value) |
Base-2 logaritm |
math::log10(value) |
Base-10 logaritm |
math::log(value, base) |
Logaritm med godtycklig bas |
math::exp(value) |
e upphöjt till värdets kraft |
math::exp2(value) |
2 upphöjt till värdets kraft |
math::pow(base, exp) |
Höjer basen till kraften i exp |
math::cos(value) |
Cosinin (radianer) |
math::sin(value) |
Sinus (radianer) |
math::tan(value) |
Tangent (radianer) |
math::acos(value) |
Arccosinus (returnerar radianer) |
math::asin(value) |
Arcsinus (returnerar radianer) |
math::atan(value) |
Arctangent (returnerar radianer) |
math::atan2(y, x) |
Arctangens med fyra kvadranter (returnerar radianer) |
math::hypot(a, b) |
Längden på hypotenusen från sidorna a och b |
Strängfunktioner
| Function | Beskrivning |
|---|---|
len(string) |
Teckenlängd för en sträng eller elementantal för en tuppeln |
str::to_lowercase(string) |
Konverterar till gemener |
str::to_uppercase(string) |
Konverterar till versaler |
str::trim(string) |
Tar bort inledande och avslutande blanksteg |
str::from(value) |
Konverterar ett värde till dess strängrepresentation |
str::substring(string, start, end) |
Extraherar en delsträng efter teckenindex |
str::regex_matches(string, pattern) |
Returnerar true om strängen matchar regex-mönstret. Endast tillgängligt i dataflödesdiagram. |
str::regex_replace(string, pattern, replacement) |
Ersätter alla regex-matchningar med ersättningssträngen. Endast tillgängligt i dataflödesdiagram. |
Datum- och tidsfunktioner
Datum- och tidsfunktioner finns endast tillgängliga i dataflödesgrafer. Förutom parse_timestamp, kräver funktioner som accepterar en tidsstämpel en RFC 3339-sträng . Strängen måste innehålla en explicit offset från Coordinated Universal Time (UTC), såsom 2026-06-17T12:00:00Z eller 2026-06-17T12:00:00-08:00. Kolumnen Returns listar den konceptuella resultattypen, som typeof med liten text anges som "float", "int", eller "string".
| Function | Retur | Beskrivning |
|---|---|---|
duration_between(start, end, unit) |
float |
Beräknar end - start med millisekundprecision. Stödda enheter är "seconds", "millis", , "minutes", "hours"och "days". Skillnader på mindre än en millisekund ger .0 Resultatet är negativt när end är minst en millisekund före start. |
day_of_week(timestamp) |
int |
Återkommer på veckodagen, där söndag är 0 och lördag är 6. |
hour_of_day(timestamp) |
int |
Returnerar timmen från och med 023. |
year_of(timestamp) |
int |
Returnerar kalenderåret. |
month_of(timestamp) |
int |
Returnerar månaden från och med 112. |
day_of_month(timestamp) |
int |
Returnerar månadens dag från och med 131. |
minute_of_hour(timestamp) |
int |
Returnerar minuten från 0 genom 59. |
second_of_minute(timestamp) |
int |
Returnerar den andra från 0 genom 59. |
timezone_offset(timestamp) |
int |
Returnerar tidsstämpelns offset från UTC inom några minuter. Till exempel returnerar -08:00 och -480 returnerar +05:30330. |
now() |
string |
Returnerar den aktuella UTC-tiden som en RFC 3339-tidsstämpel med millisekundprecision. |
format_timestamp(timestamp, pattern) |
string |
Formaterar en RFC 3339-tidsstämpel genom att använda ett strftime mönster. |
parse_timestamp(value, pattern) |
string |
Tolkar ett värde med ett strftime mönster och returnerar en RFC 3339 UTC-tidsstämpel med millisekundprecision. |
from_epoch(value, unit) |
string |
Konverterar ett Unix-epokvärde till en RFC 3339 UTC-tidsstämpel med millisekundprecision. Stödda enheter är "seconds", "millis", och "micros". Värdet kan vara en int eller float. |
to_epoch(timestamp, unit) |
int |
Konverterar en RFC 3339-tidsstämpel till ett Unix-epoch-heltal. Stödda enheter är "seconds", "millis", och "micros". |
now() läser systemklockan för Kubernetes-noden som är värd för dataflödesarbetsbelastningen varje gång funktionen körs. Anrop i samma uttryck kan returnera olika värden. I en ackumuleringsregel returnerar now() tiden då fönstret bearbetas, inte när ett inmatningsmeddelande anländer. För att minska klockskevhet mellan klusternoder, synkronisera varje nodklocka med en pålitlig tidskälla, såsom en Network Time Protocol-server.
Kalender- och klockfunktioner, såsom day_of_week, hour_of_day, och year_of, använder offset i indatatidsstämpeln. De konverterar inte först värdet till UTC. Följande exempel visar detta beteende.
| Uttryck | Result |
|---|---|
hour_of_day("2026-06-17T23:30:45-08:00") |
23 |
day_of_week("2026-06-17T23:30:45-08:00") |
3 (Onsdag) |
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 och tidsstämplar för parsning
Och format_timestamp funktionerna parse_timestamp använder strftime mönster. Följande tabell listar vanliga specifierare.
| Specificerare | Value |
|---|---|
%Y |
Fyrsiffrigt år |
%m |
Tvåsiffrig månad |
%d |
Tvåsiffrig dag i månaden |
%H |
Timme i 24-timmarsformat |
%M |
Minut |
%S |
Second |
%f |
Nanosekunder sedan sista hela sekunden, utan decimaltecken |
%.f |
Bråkdelssekunder, inklusive decimalpunkten |
%z |
Numerisk UTC-offset, såsom +0200 |
%:z |
Numerisk UTC-offset med kolon, såsom +02:00 |
För alla stödda specifierare, se Chrono strftime-dokumentationen.
format_timestamp bevarar inmatningstidsstämpelns offset. Till exempel, format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") returnerar "2026-06-09 14:00 +02:00".
parse_timestamp hanterar indata i följande ordning:
- Ett datum och tid med numerisk förskjutning. Funktionen hedrar offsetet och normaliserar resultatet till UTC.
- Ett datum och tid utan förskjutning. Funktionen antar UTC.
- En dejt utan tid. Funktionen antar midnatt UTC.
Följande exempel visar hur parse_timestamp varje typ av indata hanteras.
| Uttryck | Result |
|---|---|
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" |
Viktigt!
parse_timestamp stöder inte tidsvärden eller tidszonsförkortningar som PST. Använd %z eller %:z med numerisk offset istället för %Z. Parsning normaliserar tidsstämplar till UTC, men formateringen bevarar ingångsoffsetet. Därför är de två funktionerna inte exakta inverser för värden som inkluderar en icke-noll offset.
Konvertera Unix-epokvärden
Använd from_epoch och to_epoch för att konvertera mellan Unix-epokvärden och RFC 3339-tidsstämplar.
| Uttryck | Result |
|---|---|
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 accepterar negativa värden för datum före 1 januari 1970. Dess utdata har millisekundprecision, så att omvandla epokmikrosekunder till en tidsstämpel gör att precisionen under en millisekund blir borta.
to_epoch tar hänsyn till tidsstämpelns UTC-offset och rundar av värden före 1970 ner till nästa lägre heltal för den valda enheten.
Datum- och tidfunktioner kan skrivas. Till exempel beräknar duration_between($1, now(), "days") den åldern i dagar för en RFC 3339-tidsstämpel som anges som första regelinmatning. För att läsa en tidsstämpels timme efter att den konverterats till UTC, använd hour_of_day(from_epoch(to_epoch($1, "micros"), "micros")).
Villkors- och samlingsfunktioner
| Function | Beskrivning |
|---|---|
if(condition, trueVal, falseVal) |
Returnerar trueVal när villkoret är sant, annars falseVal |
min(values) |
Minst ett eller flera numeriska värden eller en matris |
max(values) |
Maximalt ett eller flera numeriska värden eller en matris |
contains(tuple, value) |
Returnerar sant om tuppeln innehåller värdet |
contains_any(tuple, candidates) |
Returnerar sant om tuppeln innehåller något värde från kandidaternas tupplar |
typeof(value) |
Returnerar typen som en sträng: "string", "float", "int", "boolean", "tuple"eller "empty" |
Sammansättningsfunktioner (endast fönstertransformering)
Dessa funktioner är endast tillgängliga i ackumuleringsregler i fönstertransformeringar. Var och en tar en enda positionsvariabel.
| Function | Retur | Beteende för tomma fönster |
|---|---|---|
average($n) |
Medelvärde av numeriska värden | Error |
sum($n) |
Summa av numeriska värden | 0,0 |
min($n) |
Minsta numeriska värde | Error |
max($n) |
Maximalt numeriskt värde | Error |
count($n) |
Antal meddelanden där fältet finns | 0 |
first($n) |
Första värdet i fönstret | Error |
last($n) |
Sista värdet i fönstret | Error |
Mer information om hur du använder aggregeringsfunktioner finns i Sammanställa data över tid.
Villkorsstyrd logik
if Använd funktionen för att förgrena logik i ett uttryck:
| Uttryck | Beskrivning |
|---|---|
if($1 > 100, "high", "normal") |
Returnerar "hög" när temperaturen överstiger 100 |
if($2 == (), $1, $1 * $2) |
Faller tillbaka till $1 när $2 saknas |
if($1 > 5, true, false) |
Returnerar ett booleskt värde baserat på ett tröskelvärde |
Använd () (det tomma värdet) i jämförelser för att identifiera saknade fält.
Tips/Råd
Om du bara behöver en statisk återställning för ett fält som saknas är syntaxen ?? <default> enklare. Se Standardvärden. Reservera if för fall där du behöver välja mellan beräknade värden.
Metadatafält
Läsa från och skriva till meddelandemetadata med hjälp $metadata. av prefixet i fälten inputs eller output i en regel. Metadatareferenser finns i fältsökvägen, inte i själva uttrycket.
Metadataegenskaper
-
Ämne: Fungerar för både MQTT och Kafka. Den innehåller textsträngen där meddelandet publicerades. Exempel:
$metadata.topic. -
Användaregenskap: I MQTT refererar detta till de nyckel-/värdepar med fritt format som ett MQTT-meddelande kan innehålla. Om till exempel MQTT-meddelandet publicerades med en användaregenskap med nyckeln "prioritet" och värdet "hög" innehåller referensen
$metadata.user_property.priorityvärdet "hög". Användaregenskapsnycklar kan vara godtyckliga strängar och kan kräva att de tas bort:$metadata.user_property."weird key"använder nyckeln "konstig nyckel" (med ett blanksteg). -
Systemegenskap: Den här termen används för varje egenskap som inte är en användaregenskap. För närvarande stöds endast en enda systemegenskap:
$metadata.system_property.content_type, som läser innehållstypegenskapen för MQTT-meddelandet (om den anges). -
Rubrik: Det här är Kafka-motsvarigheten till MQTT-användaregenskapen. Kafka kan använda valfritt binärt värde för en nyckel, men dataflöden stöder endast UTF-8-strängnycklar. Exempel:
$metadata.header.priority. Den här funktionen liknar användaregenskaper.
| Fält | Beskrivning |
|---|---|
$metadata.topic |
MQTT-ämnet i meddelandet |
$metadata.user_property.<key> |
En användaregenskap i meddelandet, identifierad av nyckeln |
$metadata.system_property.content_type |
Systemegenskapen för innehållstyp |
$metadata.header.<key> |
Ett Kafka-huvudvärde som identifieras av nyckeln |
Läsa från metadata
Om du vill referera till källavsnittet och en användaregenskap i ett uttryck anger du dem som indata:
| Input | Variabel |
|---|---|
$metadata.topic |
$1 |
$metadata.user_property.device_id |
$2 |
Uttryck: $1 + "/" + $2
I följande exempel mappas MQTT-egenskapen topic till fältet origin_topic i utdata:
| Input | Resultat |
|---|---|
$metadata.topic |
origin_topic |
Om användaregenskapen priority finns i MQTT-meddelandet visar följande exempel hur du mappar den till ett utdatafält:
| Input | Resultat |
|---|---|
$metadata.user_property.priority |
priority |
Skriva till metadata
Om du vill ange en användaregenskap i utdatameddelandet använder du $metadata.user_property.<key> som utdatafält.
Om du anger ett metadatafält till ett tomt värde (()) tar du bort det. För användaregenskaper tillåts dubbletter av nycklar.
Du kan också mappa metadataegenskaper till ett utdatahuvud eller en användaregenskap. I följande exempel mappas MQTT topic till origin_topic fältet i utdatans användaregenskap:
| Input | Resultat |
|---|---|
$metadata.topic |
$metadata.user_property.origin_topic |
Om den inkommande nyttolasten innehåller ett priority fält visar följande exempel hur du mappar den till en MQTT-användaregenskap:
| Input | Resultat |
|---|---|
priority |
$metadata.user_property.priority |
Samma exempel för Kafka:
| Input | Resultat |
|---|---|
priority |
$metadata.header.priority |
Metadatafält stöds i kart-, filter- och grenregler. De är inte tillgängliga i regler för fönster (ackumulerade).
Senast kända värde
Använd suffixet ? $last på indata för att be körningen att komma ihåg det senaste värdet för fältet. Om fältet saknas i det aktuella meddelandet används det senast kända värdet i stället.
| Input | Beteende |
|---|---|
temperature ? $last |
Använder den senast kända temperaturen om det aktuella meddelandet inte har något temperature fält |
Direktivet ? $last är skiftlägeskänsligt och stöder flexibla blanksteg.
Viktigt!
Senast kända värden lagras endast i minnet. De går förlorade när podden startas om och delas inte mellan repliker.
Senast kända värde stöds i kart-, filter- och grenregler. Det är inte tillgängligt i regler för fönster (ackumulerade).
Standardvärden
Använd suffixet ?? <default> på indata för att ange ett återställningsvärde när fältet saknas. Standardtyper som stöds: heltal, flyttal, booleskt värde, sträng och null.
Anmärkning
Syntaxen ?? <default> är endast tillgänglig i dataflödesdiagram. Det stöds inte i dataflödesindata builtInTransformation .
| Input | Reserv |
|---|---|
temperature ?? 0 |
Heltal 0 |
status ?? "unknown" |
Sträng "okänd" |
threshold ?? 98.6 |
Flyttal 98,6 |
enabled ?? true |
Booleskt sant |
Kombinera senast kända värde och standard
Du kan kombinera ? $last och ?? <default>. Körningen kontrollerar det aktuella meddelandet först, sedan det senast kända värdet och sedan standardvärdet. Om du använder ?? <default> utan ? $lastkontrollerar körningen det aktuella meddelandet och sedan standardvärdet direkt.
| Input | Utvärderingsordning |
|---|---|
temperature ?? 0 |
Aktuellt värde, sedan standard (0) |
temperature ? $last ?? 0 |
Aktuellt värde, sedan senast känt, sedan standard (0) |
Standardvärden stöds i map-, filter- och grenregler. De är inte tillgängliga i regler för fönster (ackumulerade).
Datatyper
| Type | Beskrivning | Exempel |
|---|---|---|
| Int | 64-bit signerat heltal |
42, -7 |
| Float | 64-bitars flyttals |
3.14, -0.5 |
| String | UTF-8-text | "hello" |
| Bool | Boolean |
true, false |
| Tupel | Matris med primitiva värden | (1, 2, 3) |
| Tomt | Värde saknas eller null | () |
| JSON | JSON-objekt som skickats | (kan inte användas i uttryck) |
JSON-objekt och matriser bevaras as-is när fält kopieras utan uttryck, men de kan inte användas som indata för uttrycksutvärdering.
Funktionsstöd efter transformeringstyp
Samma uttrycksspråk fungerar över transformationer, men resultatet av ett uttryck betyder något olika i varje transform:
| Omvandla | Vad uttrycksresultatet gör |
|---|---|
| Karta | Ger värdet skrivet till output |
| Filter | När det stämmer, släpps budskapet. För att fortsätta matcha meddelanden, invertera uttrycket. |
| Filial | Skickar meddelandet vidare till ELLER-vägen truefalse . Inget släpps. |
| Fönster (ackumuleras) | Ger det aggregerade värdet för fönstret |
| Feature | Karta | Filter | Filial | Fönster (ackumuleras) |
|---|---|---|---|---|
| Positionsvariabler | Ja | Ja | Ja | Ja |
| Operatörer | Ja | Ja | Ja | Ja |
| Inbyggda funktioner | Ja | Ja | Ja | Ja |
| Sammansättningsfunktioner | No | No | No | Ja |
$metadata Tillgång |
Ja | Ja | Ja | No |
$context Anrikning |
Ja | Ja | Ja | No |
? $last |
Ja | Ja | Ja | No |
?? <default> ¹ |
Ja | Ja | Ja | No |
str::regex_matches
/
str::regex_replace ¹ |
Ja | Ja | Ja | No |
| Jokertecken | Ja | No | No | No |
¹ Endast tillgängligt i dataflödesdiagram. Stöds inte i dataflödesindata builtInTransformation .
Punkt notation och escapeing
Punkt notation används ofta för att referera till kapslade fält. En standardsökväg för punkt notation ser ut som Person.Address.Street.Number.
I ett dataflöde kan en sökväg som Person.Date of Birthbeskrivs av punkt notation innehålla strängar och vissa specialtecken utan att behöva fly, till exempel .
I andra fall är det nödvändigt att fly, till exempel: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Den här sökvägen innehåller bland annat punkter i fältnamnet. Utan escape skulle fältnamnet fungera som avgränsare i själva punktnotationen.
Även om ett dataflöde parsar en sökväg behandlar det bara två tecken som specialtecken:
- Punkter (
.) fungerar som fältavgränsare. - Dubbla citationstecken, när de placeras i början eller slutet av ett segment, startar en utlämnad sektion där prickar inte behandlas som fältseparatorer.
Andra tecken behandlas som en del av fältnamnet. Den här flexibiliteten är användbar i format som JSON, där fältnamn kan vara godtyckliga strängar.
Sökvägsdefinitionen måste också följa reglerna i konfigurationsformatet. När ett tecken med särskild betydelse ingår i sökvägen krävs korrekt citattecken. Till exempel måste fältnamn som börjar med ett kolon (t.ex :Person:.:name:. ) eller som börjar med ett tal följt av text (som 100 celsius.hot) citera i konfigurationen tolkas korrekt som strängar.
Escape
Den primära funktionen för att fly i en punkt noterad sökväg är att hantera användningen av punkter som ingår i fältnamn i stället för avgränsare. Sökvägen Payload."Tag.10".Value består till exempel av tre segment: Payload, Tag.10och Value. De dubbla citattecknen runt Tag.10 hindrar punkten från att fungera som avgränsare.
Undantag från regler i punkt notation
Undvik varje segment separat: Om flera segment innehåller punkter måste dessa segment omges av dubbla citattecken. Andra segment kan också citeras, men det påverkar inte vägtolkningen. Till exempel:
Payload."Tag.10".Measurements."Vibration.$12".ValueCitera ett segment endast när det behöver tas bort. Lägg till dubbla citattecken runt ett segment endast när det innehåller en prick (eller ett annat tecken som annars skulle misstolkas som en separator). Citera inte ett vanligt fältnamn.
Till exempel, för ett fält med namnet inuti
TagNameRecords:Gör detta Inte detta Records.TagNameRecords."TagName"De extra citattecknen hjälper inte, och i vissa verktyg, som operations experience data flow-editorn, blir de en del av fältnamnet. Mappningen letar sedan efter ett fält med namnet
"TagName"(citat inkluderat), vilket inte finns, så inget stämmer. Du kan se detta i definitionen av exporterade dataflödes, där namnet förekommer med undanflygande citattecken, som\"TagName\". För att åtgärda det, ta bort citattecknen så att namnet baraTagNameblir .Korrekt användning av dubbla citattecken: Dubbla citattecken måste öppna och stänga ett undantaget segment. Citattecken i mitten av segmentet betraktas som en del av fältnamnet. Sökvägen
Payload.He said: "Hello", and waveddefinierar till exempel två fält:PayloadochHe said: "Hello", and waved. När en punkt visas under dessa omständigheter fortsätter den att fungera som avgränsare. SökvägenPayload.He said: "No. It is done"är till exempel uppdelad i segmentenPayload,He said: "NoochIt is done"(börjar med ett blanksteg).
Segmenteringsalgoritm
- Om det första tecknet i ett segment är ett citattecken söker parsern efter nästa citattecken. Strängen som omges av dessa citattecken betraktas som ett enda segment.
- Om segmentet inte börjar med ett citattecken identifierar parsern segment genom att söka efter nästa punkt eller slutet av sökvägen.
Jokertecken
Använd ett jokertecken (*) i sökvägar för in- och utdata för att matcha flera fält samtidigt. Detta är användbart när utdata liknar indata, eller när du behöver använda samma transformering i många fält utan att visa var och en.
Viktigt!
Jokerexemplen i detta avsnitt passerar genom de fält som indata innehåller. För MQTT, Kafka och annan JSON-utgång är detta okej. För en lagringsdestination med Parquet- eller Delta-serialisering måste utdataschemat deklarera varje blad som wildcardet expanderar till. Om körningsdatan innehåller ett fält som schemat inte deklarerar, tas posten bort. Generera schemat från representativa stickprovsdata och se Storage-serialiseringsbeteende.
Kopiera alla fält
Så här skickar du varje fält genom oförändrat:
| Input | Resultat |
|---|---|
* |
* |
Matchar * varje fältsökväg i indata och placerar den på samma sökväg i utdata. Den del av sökvägen som * matchar kallas det insamlade segmentet. I utdata ersätter *det insamlade segmentet .
Platta ut kapslade fält
Om du vill flytta fält från ett kapslat objekt till rotnivån lägger du prefixet i indata och * i utdata:
| Input | Resultat |
|---|---|
Sensors.* |
* |
Metadata.* |
* |
Med dessa indata:
{
"Sensors": { "Temperature": 72.5, "Pressure": 14.7 },
"Metadata": { "LineId": "Line-3", "Shift": "A" }
}
Utdata plattar ut båda objekten:
{
"Temperature": 72.5,
"Pressure": 14.7,
"LineId": "Line-3",
"Shift": "A"
}
Omstrukturera fält
Om du vill flytta fält under en ny överordnad lägger du * till indata och lägger till ett prefix i utdata:
| Input | Resultat |
|---|---|
* |
Telemetry.* |
Detta omsluter alla fält på den översta nivån i ett Telemetry objekt.
Placeringsregler för jokertecken
- Endast en
*tillåts per in- eller utdatasökväg. -
*Måste matcha ett fullständigt segment (inte ett partiellt segment somSensor*). -
*Kan visas i början (*.Value), mitten (Sensors.*.Reading) eller slutet (Sensors.*) av en sökväg.
Jokertecken med flera indata
När en regel har flera indata med jokertecken måste * samma segment avbildas i alla indata. Körningen * löser från den första indatan och letar sedan efter matchande sökvägar i de andra indata.
Om du till exempel vill medelvärdet av max- och min-avläsningarna för varje sensor:
| Input | Resultat | Uttryck |
|---|---|---|
*.Max ($1)*.Min (2 dollar) |
Averaged.* |
($1 + $2) / 2 |
Med dessa indata:
{
"Temperature": { "Max": 85.3, "Min": 62.1 },
"Pressure": { "Max": 15.2, "Min": 14.1 }
}
Avbildningarna *Temperature först, så regeln letar efter både Temperature.Max och Temperature.Min. Sedan fångar den in Pressure och letar Pressure.Max efter och Pressure.Min. Resultatet är:
{
"Averaged": { "Temperature": 73.7, "Pressure": 14.65 }
}
Om några indata inte kan matchas för ett insamlat segment (till exempel *.Mid.Avg när fältet är kapslat på ett annat sätt) hoppas det segmentet över. Kontrollera att sökvägarna i alla indata återspeglar datans faktiska struktur.
Åsidosätt ett jokertecken för specifika fält
Du kan kombinera en jokerteckenregel med specifika regler. Specifika regler har företräde när de har en lägre täckning (färre segment matchas av *). Detta kallas specialisering.
| Input | Resultat | Uttryck |
|---|---|---|
*.Max ($1)*.Min (2 dollar) |
Averaged.* |
($1 + $2) / 2 |
Pressure.Max ($1)Pressure.Min (2 dollar) |
Averaged.PressureAdj |
($1 + $2 + 1.0) / 2 |
Den första regeln gäller för alla fält. Den andra regeln åsidosätter den endast för Pressure , eftersom Pressure.Max den är mer specifik än *.Max (täckning 0 jämfört med täckning 1).
Om du vill exkludera ett fält helt använder du tomma utdata:
| Input | Resultat |
|---|---|
Pressure.Max, Pressure.Min |
(tom) |
Ett tomt utdata släpper fältet från resultatet. Detta åsidosätter alla jokerteckenregler som annars skulle inkludera den.
Flera regler för samma indata
Om två regler har samma eller högre täckning gäller båda. På så sätt kan du beräkna flera härledda värden från samma indata:
| Input | Resultat | Uttryck |
|---|---|---|
*.Max ($1)*.Min (2 dollar) |
Stats.*.Avg |
($1 + $2) / 2 |
*.Max ($1)*.Min (2 dollar) |
Stats.*.Range |
$1 - $2 |
Båda reglerna körs för varje insamlat segment, vilket ger två utdatafält per sensor.
Jokertecken i kontextualiseringsdatauppsättningar
Du kan använda jokertecken med $context referenser för att kopiera alla fält från en datauppsättning:
| Input | Resultat |
|---|---|
$context(assetMeta).* |
Asset.* |
Detta kopierar varje fält från datamängden assetMetaAsset till avsnittet i utdata.
Kontextualiseringsdatauppsättningar
Med kontextualiseringsdatauppsättningar kan mappningar integrera extra data från externa databaser. Använd prefixet $context(datasetName) för att referera till fält från en datauppsättning. Läser $context(position).BaseSalary till exempel fältet BaseSalary från en datauppsättning med namnet position.
Mer information om hur du konfigurerar kontextualiseringsdatamängder finns i Berika data med hjälp av dataflöden och Berika med externa data i dataflödesdiagram.
Relaterat innehåll
Om du kom hit för att leta efter syntaxen som används i en specifik transform, visar dessa artiklar uttryck i kontext:
| Så här gör du detta | Se |
|---|---|
Byt namn, omstrukturera eller beräkna fält, inklusive enhetskonverteringar som cToF |
Transformera data med karta i dataflödesdiagram |
| Släpp meddelanden eller led dem längs olika vägar med ett villkor | Filtrera och dirigera data i dataflödesdiagram |
| Beräkna medelvärden, summeringar eller räkningar över ett tidsfönster | Aggregera data över tid |
| Kolla referensdata från state store | Berika med externa data |
| Ställ in det utdata MQTT-ämnet från meddelandeinnehållet | Dirigera meddelanden till olika ämnen |
| Bygg pipelinen som innehåller dessa transformationer | Processdata med dataflödesgrafer |
För dataflöden, se Karta data genom att använda dataflöden och Filterdata i ett dataflöde.