Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Esta referencia se aplica tanto a los flujos de datos como a los gráficos de flujo de datos. Ambos usan el mismo lenguaje de expresión para las transformaciones de asignación, filtro y enriquecimiento. Los gráficos de flujo de datos también admiten transformaciones de rama y ventana (acumulado), que se indican cuando corresponda.
Variables posicionales
La matriz de inputs cada regla determina las variables disponibles en .expression La primera entrada se convierte en $1, la segunda se convierte $2en y así sucesivamente.
| Entradas | Expression | Resultado |
|---|---|---|
Position, Office |
$1 + ", " + $2 |
Concatena Position y Office con una coma |
temperature |
cToF($1) |
Convierte Celsius a Fahrenheit |
temperature, humidity |
$1 * $2 < 100000 |
Comprueba un umbral con dos campos |
Si solo se especifica una entrada y no se proporciona ninguna expresión, el valor de esa entrada se copia directamente en la salida.
Operadores
Las expresiones admiten los operadores siguientes, enumerados de mayor a menor prioridad:
| Precedence | Operadores | Descripción |
|---|---|---|
| 1 | ! |
NOT lógico (unario) |
| 2 | ^ |
Exponenciación |
| 3 |
*, , /, % |
Multiplicación, división, módulo |
| 4 |
+, - |
Suma/concatenación de cadenas, resta |
| 5 |
<, >, , <=, >= |
Comparación |
| 6 |
==, != |
Igualdad, desigualdad |
| 7 | && |
Y lógico |
| 8 | \|\| |
O lógico |
El + operador concatena cadenas cuando al menos un operando es una cadena. Use paréntesis para invalidar la precedencia predeterminada.
Importante
Utiliza los operadores && lógicos simbólicos (AND), || (OR) y ! (NOT). La palabra clave forma and, or, y not no está soportada. Por ejemplo, escriba $1 == "a" || $1 == "b" en lugar de $1 == "a" or $1 == "b".
Ejemplos:
| Expression | Descripción |
|---|---|
$1 * 2 ^ 3 |
Exponenciación primero: $1 * 8 |
($1 * 2) ^ 3 |
Invalidación de paréntesis: multiplicar primero |
-$1 * 2 |
Negación primero y, a continuación, multiplicar |
$1 > 100 && $2 > 200 |
Condiciones de cadena con AND lógico |
Funciones integradas
Funciones de conversión de unidades
Estas funciones aceptan un único valor numérico y devuelven un valor float.
| Function | Conversión | Formula |
|---|---|---|
cToF(value) |
De Celsius a Fahrenheit | F = (C × 9/5) + 32 |
fToC(value) |
De Fahrenheit a Celsius | C = (F - 32) × 5/9 |
psiToBar(value) |
De PSI a bar | bar = PSI × 0,0689476 |
barToPsi(value) |
De bar a PSI | PSI = bar / 0,0689476 |
inToCm(value) |
Pulgadas a centímetros | cm = en × 2,54 |
cmToIn(value) |
Centímetros a pulgadas | en = cm / 2,54 |
ftToM(value) |
Pies a metros | m = ft × 0,3048 |
mToFt(value) |
Metros a pies | ft = m / 0,3048 |
lbToKg(value) |
Libras a kilos | kg = lb × 0,453592 |
kgToLb(value) |
Kilos a libras | lb = kg / 0,453592 |
galToL(value) |
Galones de EE. UU. a litros | L = gal × 3,78541 |
lToGal(value) |
Litros a galones estadounidenses | gal = L / 3,78541 |
Escalado y redondeo de funciones
| Function | Descripción |
|---|---|
scale(value, srcLo, srcHi, dstLo, dstHi) |
Escala linealmente value desde el intervalo de origen hasta el intervalo de destino. Los cinco argumentos deben ser numéricos. |
round_n(value, decimals) |
Redondea un float al número especificado de posiciones decimales (de 0 a 15). |
Funciones matemáticas
Estas funciones proceden de la biblioteca matemática integrada.
| Function | Descripción |
|---|---|
floor(value) |
Entero mayor menor o igual que un número |
round(value) |
Entero más cercano, redondeando los casos a medio camino lejos de 0,0 |
ceil(value) |
Entero menor mayor o igual que un número |
math::abs(value) |
Valor absoluto |
math::sqrt(value) |
Raíz cuadrada (devuelve NaN para números negativos) |
math::cbrt(value) |
Raíz del cubo |
math::ln(value) |
Logaritmo natural |
math::log2(value) |
Logaritmo base 2 |
math::log10(value) |
Logaritmo base 10 |
math::log(value, base) |
Logaritmo con base arbitraria |
math::exp(value) |
e elevado a la potencia del valor |
math::exp2(value) |
2 elevado a la potencia del valor |
math::pow(base, exp) |
Eleva la base a la potencia de exp |
math::cos(value) |
Coseno (radianes) |
math::sin(value) |
Seno (radianes) |
math::tan(value) |
Tangente (radianes) |
math::acos(value) |
Arccosine (devuelve radianes) |
math::asin(value) |
Arcoseno (devuelve radianes) |
math::atan(value) |
Arctangent (devuelve radianes) |
math::atan2(y, x) |
Arco de cuatro cuadrantes (devuelve radianes) |
math::hypot(a, b) |
Longitud de la hipotenusa de los lados a y b |
Funciones de cadena
| Function | Descripción |
|---|---|
len(string) |
Longitud de caracteres de una cadena o recuento de elementos de una tupla |
str::to_lowercase(string) |
Convierte en minúsculas. |
str::to_uppercase(string) |
Convierte en mayúsculas |
str::trim(string) |
Quita el espacio en blanco inicial y final |
str::from(value) |
Convierte un valor en su representación de cadena. |
str::substring(string, start, end) |
Extrae una subcadena por índice de caracteres |
str::regex_matches(string, pattern) |
Devuelve true si la cadena coincide con el patrón regex. Solo está disponible en gráficos de flujo de datos. |
str::regex_replace(string, pattern, replacement) |
Reemplaza todas las coincidencias de expresiones regulares por la cadena de reemplazo. Solo está disponible en gráficos de flujo de datos. |
Funciones de fecha y hora
Las funciones de fecha y hora solo están disponibles en gráficos de flujo de datos. Excepto para parse_timestamp, las funciones que aceptan una marca de tiempo requieren una cadena RFC 3339 . La cadena debe incluir un desplazamiento explícito respecto al Tiempo Universal Coordinado (UTC), como 2026-06-17T12:00:00Z o 2026-06-17T12:00:00-08:00. La Returns columna muestra el tipo de resultado conceptual, que typeof se indica en minúsculas como "float", "int", o "string".
| Function | Devoluciones | Descripción |
|---|---|---|
duration_between(start, end, unit) |
float |
Calcula end - start con precisión milisegundos. Las unidades apoyadas son "seconds", "millis", "minutes", "hours", y "days". Diferencias de menos de un milisegundo retornan 0. El resultado es negativo cuando end está al menos un milisegundo antes startde . |
day_of_week(timestamp) |
int |
Devuelve el día de la semana, donde es 0 domingo y sábado 6es . |
hour_of_day(timestamp) |
int |
Devuelve la hora desde 0 a través 23de . |
year_of(timestamp) |
int |
Devuelve el año natural. |
month_of(timestamp) |
int |
Devoluciona el mes desde 1 hasta 12. |
day_of_month(timestamp) |
int |
Devuelve el día del mes desde 1 hasta 31. |
minute_of_hour(timestamp) |
int |
Devuelve el minuto de 0 a través 59de . |
second_of_minute(timestamp) |
int |
Devuelve la segunda desde 0 a través 59de . |
timezone_offset(timestamp) |
int |
Devuelve el desfasamiento de la marca de tiempo respecto al UTC en minutos. Por ejemplo, -08:00 retorna -480 y +05:30 retorna 330. |
now() |
string |
Devuelve la hora UTC actual como una marca de tiempo RFC 3339 con precisión milisegundo. |
format_timestamp(timestamp, pattern) |
string |
Formatea una marca de tiempo RFC 3339 usando un strftime patrón. |
parse_timestamp(value, pattern) |
string |
Analiza un valor usando un strftime patrón y devuelve una marca de tiempo RFC 3339 UTC con precisión milisegundo. |
from_epoch(value, unit) |
string |
Convierte un valor de época Unix a una marca de tiempo RFC 3339 UTC con precisión milisegundos. Las unidades apoyadas son "seconds", "millis", y "micros". El valor puede ser un int o float. |
to_epoch(timestamp, unit) |
int |
Convierte una marca de tiempo RFC 3339 en un entero de época Unix. Las unidades apoyadas son "seconds", "millis", y "micros". |
now() lee el reloj del sistema del nodo Kubernetes que alberga la carga de trabajo del flujo de datos cada vez que la función se ejecuta. Las llamadas en la misma expresión pueden devolver valores diferentes. En una regla de acumulación, now() devuelve el momento en que se procesa la ventana, no cuando llega un mensaje de entrada. Para reducir el desfase de reloj entre los nodos del clúster, sincroniza cada nodo con una fuente de tiempo fiable, como un servidor de Protocolo de Tiempo de Red.
Las funciones de calendario y reloj, como day_of_week, hour_of_day, y year_of, utilizan el desplazamiento en la marca de tiempo de entrada. No convierten primero el valor a UTC. Los siguientes ejemplos muestran este comportamiento.
| Expression | Resultado |
|---|---|
hour_of_day("2026-06-17T23:30:45-08:00") |
23 |
day_of_week("2026-06-17T23:30:45-08:00") |
3 (Miércoles) |
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 |
Formato y marcas de tiempo de análisis
Las format_timestamp funciones y parse_timestamp usan strftime patrones. La siguiente tabla enumera los especificadores comunes.
| Especificador | Value |
|---|---|
%Y |
Año de cuatro dígitos |
%m |
Mes de dos dígitos |
%d |
Día del mes de dos dígitos |
%H |
Hora en formato de 24 horas |
%M |
Minute |
%S |
Segundo |
%f |
Nanosegundos desde el último segundo entero, sin punto decimal |
%.f |
Segundos fraccionarios, incluyendo el punto decimal |
%z |
Desplazamiento numérico UTC, como +0200 |
%:z |
Desplazamiento numérico UTC con dos puntos, como +02:00 |
Para todos los especificadores compatibles, consulte la documentación de Chrono strftime.
format_timestamp conserva el desplazamiento de la marca de tiempo de entrada. Por ejemplo, format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") devuelve "2026-06-09 14:00 +02:00".
parse_timestamp gestiona las entradas en el siguiente orden:
- Una fecha y hora con un desplazamiento numérico. La función respeta el desplazamiento y normaliza el resultado a UTC.
- Una fecha y hora sin desfasamiento. La función asume UTC.
- Una cita sin hora. La función asume medianoche UTC.
Los siguientes ejemplos muestran cómo parse_timestamp gestiona cada tipo de entrada.
| Expression | Resultado |
|---|---|
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" |
Importante
parse_timestamp no soporta valores solo de tiempo ni abreviaturas de zona horaria como PST. Usa %z o %:z con un desplazamiento numérico en lugar de %Z. El análisis normaliza las marcas de tiempo a UTC, pero el formato conserva el desplazamiento de entrada. Por lo tanto, las dos funciones no son inversos exactos para valores que incluyen un desplazamiento distinto de cero.
Convertir valores de época Unix
Usar from_epoch y to_epoch convertir entre valores de época Unix y marcas de tiempo RFC 3339.
| Expression | Resultado |
|---|---|
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 acepta valores negativos para fechas anteriores al 1 de enero de 1970. Su salida tiene precisión milisegundos, por lo que convertir microsegundos de época en una marca de tiempo descarta precisión por debajo de un milisegundo.
to_epoch tiene en cuenta el desplazamiento UTC de la marca de tiempo y redondea los valores anteriores a 1970 hasta el siguiente número entero inferior para la unidad seleccionada.
Se pueden componer funciones de fecha y hora. Por ejemplo, duration_between($1, now(), "days") calcula la antigüedad en días de una marca de tiempo RFC 3339 proporcionada como la primera entrada de regla. Para leer la hora de una marca de tiempo después de convertirla a UTC, utiliza hour_of_day(from_epoch(to_epoch($1, "micros"), "micros")).
Funciones condicionales y de recopilación
| Function | Descripción |
|---|---|
if(condition, trueVal, falseVal) |
Devuelve trueVal cuando la condición es true; de lo contrario, devuelve . falseVal |
min(values) |
Mínimo de uno o varios valores numéricos o una matriz |
max(values) |
Máximo de uno o más valores numéricos o una matriz |
contains(tuple, value) |
Devuelve true si la tupla contiene el valor |
contains_any(tuple, candidates) |
Devuelve true si la tupla contiene cualquier valor de la tupla candidata |
typeof(value) |
Devuelve el tipo como una cadena: "string", , "float""int", "boolean", , "tuple"o"empty" |
Funciones de agregación (solo transformaciones de ventana)
Estas funciones solo están disponibles en reglas de acumulación dentro de transformaciones de ventana. Cada toma una sola variable posicional.
| Function | Devoluciones | Comportamiento de ventana vacía |
|---|---|---|
average($n) |
Media de valores numéricos | Error |
sum($n) |
Suma de valores numéricos | 0,0 |
min($n) |
Valor numérico mínimo | Error |
max($n) |
Valor numérico máximo | Error |
count($n) |
Recuento de mensajes en los que existe el campo | 0 |
first($n) |
Primer valor de la ventana | Error |
last($n) |
Último valor de la ventana | Error |
Para más información sobre el uso de funciones de agregación, consulte Agregado de datos a lo largo del tiempo.
Lógica condicional
Use la función para bifurcar la if lógica dentro de una expresión:
| Expression | Descripción |
|---|---|
if($1 > 100, "high", "normal") |
Devuelve "alto" cuando la temperatura supera los 100 |
if($2 == (), $1, $1 * $2) |
Retrocede a $1 cuando faltan $2 |
if($1 > 5, true, false) |
Devuelve un valor booleano basado en un umbral. |
Use () (el valor vacío) en comparaciones para detectar campos que faltan.
Sugerencia
Si solo necesita una reserva estática para un campo que falta, la ?? <default> sintaxis es más sencilla. Consulte Valores predeterminados. Reserve if para los casos en los que necesite elegir entre valores calculados.
Campos de metadatos
Leer y escribir en metadatos de mensaje mediante el $metadata. prefijo en los inputs campos o output de una regla. Las referencias de metadatos van en la ruta de acceso del campo, no en la propia expresión.
Propiedades de metadatos
-
Tema: Funciona tanto para MQTT como para Kafka. Contiene la cadena de texto donde se publicó el mensaje. Ejemplo:
$metadata.topic. -
Propiedad de usuario: en MQTT, hace referencia a los pares clave-valor de forma libre que puede llevar un mensaje MQTT. Por ejemplo, si el mensaje MQTT se publicó con una propiedad de usuario con la clave "priority" y el valor "high", la
$metadata.user_property.priorityreferencia contiene el valor "high". Las claves de propiedad de usuario pueden ser cadenas arbitrarias y pueden requerir escape:$metadata.user_property."weird key"usa la clave "weird key" (con un espacio). -
Propiedad del sistema: este término se usa para cada propiedad que no es una propiedad de usuario. Actualmente, solo se admite una sola propiedad del sistema:
$metadata.system_property.content_type, que lee la propiedad de tipo de contenido del mensaje MQTT (si se establece). -
Encabezado: Este es el equivalente en Kafka de la propiedad de usuario de MQTT. Kafka puede usar cualquier valor binario para una clave, pero los flujos de datos solo admiten claves de cadena UTF-8. Ejemplo:
$metadata.header.priority. Esta funcionalidad es similar a las propiedades del usuario.
| Campo | Descripción |
|---|---|
$metadata.topic |
El tema MQTT del mensaje |
$metadata.user_property.<key> |
Una propiedad de usuario en el mensaje, identificada por clave |
$metadata.system_property.content_type |
La propiedad del sistema de tipo de contenido |
$metadata.header.<key> |
Valor de encabezado de Kafka, identificado por clave |
Lectura de metadatos
Para hacer referencia al tema de origen y una propiedad de usuario en una expresión, enumere como entradas:
| Entrada | Variable |
|---|---|
$metadata.topic |
$1 |
$metadata.user_property.device_id |
$2 |
Expresión: $1 + "/" + $2
En el ejemplo siguiente, la propiedad topic de MQTT se asigna al campo origin_topic en la salida:
| Entrada | Salida |
|---|---|
$metadata.topic |
origin_topic |
Si la propiedad de usuario priority está presente en el mensaje MQTT, en el ejemplo siguiente se muestra cómo asignarla a un campo de salida:
| Entrada | Salida |
|---|---|
$metadata.user_property.priority |
priority |
Escritura en metadatos
Para establecer una propiedad de usuario en el mensaje de salida, use $metadata.user_property.<key> como campo de salida.
Si se establece un campo de metadatos en un valor vacío (()) se quita. En el caso de las propiedades de usuario, se permiten claves duplicadas.
También puede asignar propiedades de metadatos a un encabezado de salida o a una propiedad de usuario. En el ejemplo siguiente, topic del MQTT se asigna al campo origin_topic en la propiedad de usuario de la salida:
| Entrada | Salida |
|---|---|
$metadata.topic |
$metadata.user_property.origin_topic |
Si la carga entrante contiene un campo priority, en el ejemplo siguiente se muestra cómo asignarla a una propiedad de usuario MQTT:
| Entrada | Salida |
|---|---|
priority |
$metadata.user_property.priority |
El mismo ejemplo para Kafka:
| Entrada | Salida |
|---|---|
priority |
$metadata.header.priority |
Los campos de metadatos se admiten en las reglas de asignación, filtro y rama. No están disponibles en las reglas de ventana (acumulación).
Último valor conocido
Use el ? $last sufijo en una entrada para indicar al runtime que recuerde el valor más reciente de ese campo. Si falta el campo en el mensaje actual, se usa en su lugar el último valor conocido.
| Entrada | Comportamiento |
|---|---|
temperature ? $last |
Usa la última temperatura conocida si el mensaje actual no tiene ningún temperature campo |
La ? $last directiva no distingue mayúsculas de minúsculas y admite espacios en blanco flexibles.
Importante
Los últimos valores conocidos solo se almacenan en memoria. Se pierden cuando el pod se reinicia y no se comparten entre réplicas.
El último valor conocido se admite en las reglas de asignación, filtro y rama. No está disponible en las reglas de ventana (acumulado).
Valores predeterminados
Use el ?? <default> sufijo en una entrada para proporcionar un valor de reserva cuando falte el campo. Tipos predeterminados admitidos: entero, float, booleano, cadena y null.
Nota:
La ?? <default> sintaxis solo está disponible en gráficos de flujo de datos. No se admite en las entradas de flujo builtInTransformation de datos.
| Entrada | Alternativa |
|---|---|
temperature ?? 0 |
Entero 0 |
status ?? "unknown" |
Cadena "desconocida" |
threshold ?? 98.6 |
Flotador 98.6 |
enabled ?? true |
Booleano verdadero |
Combinar el último valor conocido y el valor predeterminado
Puede combinar ? $last y ?? <default>. El tiempo de ejecución comprueba primero el mensaje actual, después el último valor conocido y, a continuación, el valor predeterminado. Si usa ?? <default> sin ? $last, el tiempo de ejecución comprueba el mensaje actual y, a continuación, el valor predeterminado directamente.
| Entrada | Orden de evaluación |
|---|---|
temperature ?? 0 |
Valor actual y, a continuación, predeterminado (0) |
temperature ? $last ?? 0 |
Valor actual y, a continuación, último conocido y predeterminado (0) |
Los valores predeterminados se admiten en las reglas de asignación, filtro y rama. No están disponibles en las reglas de ventana (acumulación).
Tipos de datos
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Int | Entero de 64 bits con signo |
42, -7 |
| Flotante | Número de punto flotante de 64 bits |
3.14, -0.5 |
| String | Texto UTF-8 | "hello" |
| Bool | Boolean |
true, false |
| Tuple | Matriz de valores primitivos | (1, 2, 3) |
| Vacía | Falta o valor NULL | () |
| JSON | Objeto JSON pasado a través de | (no se puede usar en expresiones) |
Los objetos y matrices JSON se conservan as-is cuando los campos se copian sin una expresión, pero no se pueden usar como entradas para la evaluación de expresiones.
Compatibilidad de características por tipo de transformación
El mismo lenguaje de expresiones funciona entre transformadas, pero el resultado de una expresión significa algo diferente en cada una:
| Transformación | Lo que hace el resultado de la expresión |
|---|---|
| Mapa | Produce el valor escrito en output |
| Filter | Cuando es cierto, el mensaje se omite. Para que los mensajes coincidan, invierte la expresión. |
| Rama | Enruta el mensaje a la true ruta o false . Nada se pierde. |
| Ventana (acumulado) | Produce el valor agregado para la ventana |
| Feature | Mapa | Filter | Rama | Ventana (acumulado) |
|---|---|---|---|---|
| Variables posicionales | Sí | Sí | Sí | Sí |
| Operadores | Sí | Sí | Sí | Sí |
| Funciones integradas | Sí | Sí | Sí | Sí |
| Funciones de agregación | No | No | No | Sí |
$metadata acceso |
Sí | Sí | Sí | No |
$context enriquecimiento |
Sí | Sí | Sí | No |
? $last |
Sí | Sí | Sí | No |
?? <default> ¹ |
Sí | Sí | Sí | No |
str::regex_matches
/
str::regex_replace ¹ |
Sí | Sí | Sí | No |
| Caracteres comodín | Sí | No | No | No |
¹ Solo disponible en gráficos de flujo de datos. No se admite en las entradas de flujo builtInTransformation de datos.
Notación de puntos y escape
La notación de puntos se usa ampliamente para hacer referencia a campos anidados. Una ruta de acceso de notación de puntos estándar tiene el aspecto de Person.Address.Street.Number.
En un flujo de datos, una ruta de acceso descrita por notación de puntos puede incluir cadenas y algunos caracteres especiales sin necesidad de escape, como Person.Date of Birth.
En otros casos, el escape es necesario, por ejemplo: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Esta ruta de acceso, entre otros caracteres especiales, contiene puntos dentro del nombre del campo. Si no se escapa, el nombre del campo serviría como separador en la notación de puntos.
Mientras un flujo de datos analiza una ruta de acceso, trata solo dos caracteres como especiales:
- Los puntos (
.) actúan como separadores de campo. - Las comillas dobles, cuando se colocan al principio o al final de un segmento, inician una sección escapada donde los puntos no se tratan como separadores de campo.
Cualquier otro carácter se trata como parte del nombre del campo. Esta flexibilidad es útil en formatos como JSON, donde los nombres de campo pueden ser cadenas arbitrarias.
La definición de ruta de acceso también debe cumplir las reglas del formato de configuración. Cuando se incluye un carácter con significado especial en la ruta de acceso, se requiere una comilla adecuada. Por ejemplo, los nombres de campo que comienzan por dos puntos (como :Person:.:name:) o que comienzan con un número seguido de texto (como 100 celsius.hot) necesitan que las comillas de la configuración se interpreten correctamente como cadenas.
Escapando
La función principal de escape en una ruta de acceso con notación de puntos es dar cabida al uso de puntos que forman parte de nombres de campo en lugar de separadores. Por ejemplo, la ruta de acceso Payload."Tag.10".Value consta de tres segmentos: Payload, Tag.10y Value. Las comillas dobles alrededor Tag.10 impiden que el punto actúe como separador.
Reglas de escape en la notación de puntos
Escapar cada segmento por separado: si varios segmentos contienen puntos, esos segmentos deben estar entre comillas dobles. También se pueden citar otros segmentos, pero no afecta a la interpretación de la ruta de acceso. Por ejemplo:
Payload."Tag.10".Measurements."Vibration.$12".ValueCita un segmento solo cuando necesite escapar. Añade comillas dobles alrededor de un segmento solo cuando contenga un punto (u otro carácter que de otro modo se interpretaría erróneamente como separador). No cites un nombre de campo cualquiera.
Por ejemplo, para un cuerpo nombrado
TagNamedentroRecordsde :Haga lo siguiente No esto Records.TagNameRecords."TagName"Las comillas extra no ayudan y, en algunas herramientas, como el editor de flujo de datos de experiencia de operaciones, pasan a formar parte del nombre del campo. El mapeo busca entonces un campo nombrado
"TagName"(entre comillas incluidas), que no existe, así que nada coincide. Esto se puede detectar en la definición de flujo de datos exportados, donde el nombre aparece entre comillas escapadas, como\"TagName\". Para solucionarlo, elimina las comillas para que el nombre sea simplementeTagName.Uso adecuado de comillas dobles: las comillas dobles deben abrir y cerrar un segmento escapado. Las comillas del centro del segmento se consideran parte del nombre del campo. Por ejemplo, la ruta de acceso
Payload.He said: "Hello", and waveddefine dos campos:PayloadyHe said: "Hello", and waved. Cuando aparece un punto en estas circunstancias, sigue funcionando como separador. Por ejemplo, la ruta de accesoPayload.He said: "No. It is done"se divide en los segmentosPayload,He said: "NoyIt is done"(empezando por un espacio).
Algoritmo de segmentación
- Si el primer carácter de un segmento es una comilla, el analizador busca las siguientes comillas. La cadena incluida entre estas comillas se considera un único segmento.
- Si el segmento no comienza con una comilla, el analizador identifica los segmentos buscando el siguiente punto o el final de la ruta de acceso.
Caracteres comodín
Use un carácter comodín (*) en las rutas de acceso de entrada y salida para que coincidan con varios campos a la vez. Esto resulta útil cuando la salida se parece estrechamente a la entrada o cuando necesita aplicar la misma transformación en muchos campos sin enumerar cada uno.
Importante
Los ejemplos comodines de esta sección pasan por los campos que contiene la entrada. Para MQTT, Kafka y otros resultados JSON, esto está bien. Para un destino de almacenamiento con serialización Parquet o Delta, el esquema de salida debe declarar cada hoja a la que se expande el comodín. Si la carga útil en tiempo de ejecución contiene un campo que el esquema no declara, el registro se elimina. Genera el esquema a partir de datos de muestra representativa y consulta Comportamiento de serialización de almacenamiento.
Copiar todos los campos
Para pasar todos los campos sin cambios:
| Entrada | Salida |
|---|---|
* |
* |
* coincide con cada ruta de acceso de campo de la entrada y la coloca en la misma ruta de acceso de la salida. La parte de la ruta de acceso que * coincide se denomina segmento capturado. En la salida, el segmento capturado reemplaza a *.
Aplanar campos anidados
Para mover campos fuera de un objeto anidado al nivel raíz, coloque el prefijo en la entrada y * en la salida:
| Entrada | Salida |
|---|---|
Sensors.* |
* |
Metadata.* |
* |
Dada esta entrada:
{
"Sensors": { "Temperature": 72.5, "Pressure": 14.7 },
"Metadata": { "LineId": "Line-3", "Shift": "A" }
}
La salida aplana ambos objetos:
{
"Temperature": 72.5,
"Pressure": 14.7,
"LineId": "Line-3",
"Shift": "A"
}
Reestructurar campos
Para mover campos debajo de un nuevo elemento primario, coloque * en la entrada y agregue un prefijo en la salida:
| Entrada | Salida |
|---|---|
* |
Telemetry.* |
Esto encapsula todos los campos de nivel superior dentro de un Telemetry objeto .
Reglas de selección de ubicación de caracteres comodín
- Solo se permite uno
*por ruta de acceso de entrada o salida. -
*debe coincidir con un segmento completo (no un segmento parcial comoSensor*). -
*puede aparecer al principio (*.Value), el medio (Sensors.*.Reading) o el final (Sensors.*) de una ruta de acceso.
Caracteres comodín de entrada múltiple
Cuando una regla tiene varias entradas con caracteres comodín, * debe capturar el mismo segmento en todas las entradas. El tiempo de ejecución resuelve desde * la primera entrada y, a continuación, busca rutas de acceso coincidentes en las otras entradas.
Por ejemplo, para calcular el promedio de lecturas máximas y mínimas para cada sensor:
| Entrada | Salida | Expression |
|---|---|---|
*.Max ($1)*.Min (2 $) |
Averaged.* |
($1 + $2) / 2 |
Dada esta entrada:
{
"Temperature": { "Max": 85.3, "Min": 62.1 },
"Pressure": { "Max": 15.2, "Min": 14.1 }
}
Captura * primero, por lo que la regla busca y TemperatureTemperature.Max.Temperature.Min A continuación, captura Pressure y busca Pressure.Max y Pressure.Min. La salida es la siguiente:
{
"Averaged": { "Temperature": 73.7, "Pressure": 14.65 }
}
Si alguna entrada no se puede resolver para un segmento capturado (por ejemplo, *.Mid.Avg cuando el campo está anidado de forma diferente), se omite ese segmento. Asegúrese de que las rutas de acceso de todas las entradas reflejan la estructura real de los datos.
Invalidación de un carácter comodín para campos específicos
Puede combinar una regla de caracteres comodín con reglas específicas. Las reglas específicas tienen prioridad cuando tienen una cobertura menor (menos segmentos coincidentes con *). Esto se denomina especialización.
| Entrada | Salida | Expression |
|---|---|---|
*.Max ($1)*.Min (2 $) |
Averaged.* |
($1 + $2) / 2 |
Pressure.Max ($1)Pressure.Min (2 $) |
Averaged.PressureAdj |
($1 + $2 + 1.0) / 2 |
La primera regla se aplica a todos los campos. La segunda regla lo invalida solo por Pressure , porque Pressure.Max es más específico que *.Max (cobertura 0 frente a cobertura 1).
Para excluir un campo por completo, use una salida vacía:
| Entrada | Salida |
|---|---|
Pressure.Max, Pressure.Min |
(vacío) |
Una salida vacía quita el campo del resultado. Esto invalida cualquier regla de caracteres comodín que, de lo contrario, la incluiría.
Varias reglas en las mismas entradas
Si dos reglas tienen la misma cobertura o superior, ambas se aplican. Esto le permite calcular varios valores derivados de las mismas entradas:
| Entrada | Salida | Expression |
|---|---|---|
*.Max ($1)*.Min (2 $) |
Stats.*.Avg |
($1 + $2) / 2 |
*.Max ($1)*.Min (2 $) |
Stats.*.Range |
$1 - $2 |
Ambas reglas se ejecutan para cada segmento capturado, lo que genera dos campos de salida por sensor.
Caracteres comodín en conjuntos de datos de contextualización
Puede usar caracteres comodín con $context referencias para copiar todos los campos de un conjunto de datos:
| Entrada | Salida |
|---|---|
$context(assetMeta).* |
Asset.* |
Esto copia todos los campos del assetMeta conjunto de datos en la Asset sección de la salida.
Conjuntos de datos de contextualización
Los conjuntos de datos de contextualización permiten que las asignaciones integren datos adicionales de bases de datos externas. Use el $context(datasetName) prefijo para hacer referencia a campos de un conjunto de datos. Por ejemplo, $context(position).BaseSalary lee el BaseSalary campo de un conjunto de datos denominado position.
Para más información sobre cómo configurar conjuntos de datos de contextualización, consulte Enriquecimiento de datos mediante flujos de datos y Enriquecimiento con datos externos en gráficos de flujo de datos.
Contenido relacionado
Si has llegado aquí buscando la sintaxis utilizada en una transformación específica, estos artículos muestran expresiones en contexto:
| Para hacer esto | Vea |
|---|---|
Renombrar, reestructurar o calcular campos, incluyendo conversiones de unidades como cToF |
Transformación de datos con mapa en gráficos de flujo de datos |
| Deja mensajes o enrutízalos por diferentes caminos con una condición | Filtrar y enrutar datos en gráficos de flujo de datos |
| Calcular promedios, sumas o recuentos durante una ventana temporal | Agregar datos a lo largo del tiempo |
| Busca datos de referencia en la tienda estatal | Enriquecimiento con datos externos |
| Establecer el tema de salida MQTT a partir del contenido del mensaje | Enrutar mensajes a diferentes temas |
| Construye la tubería que contiene estas transformaciones | Datos de proceso con gráficos de flujo de datos |
Para flujos de datos, consulte Mapear datos usando flujos de datos y Filtrar datos en un flujo de datos.