Referências de expressões para fluxos de dados e grafos de fluxo de dados

Esta referência aplica-se tanto a fluxos de dados como a grafos de fluxo de dados. Ambos utilizam a mesma linguagem de expressão para transformações de mapeamento, filtro e enriquecimento. Os grafos de fluxo de dados também suportam transformações de ramificação e janela (acumulação), que são indicadas quando aplicável.

Variáveis posicionais

O array de inputs cada regra determina as variáveis disponíveis no expression. A primeira entrada torna-se $1, a segunda torna-se $2, e assim sucessivamente.

Insumos Expression Result
Position, Office $1 + ", " + $2 Concatena Posição e Cargo com uma vírgula
temperature cToF($1) Converte Celsius em Fahrenheit
temperature, humidity $1 * $2 < 100000 Verifica um limiar contra dois campos

Se apenas uma entrada for especificada e não for fornecida expressão, o valor nessa entrada é copiado diretamente para a saída.

Operadores

As expressões suportam os seguintes operadores, listados da maior para a menor precedência:

Precedence Operadores Descrição
1 ! Lógico NÃO (unário)
2 ^ Exponenciação
3 *, /, % Multiplicação, divisão, módulo
4 +, - Adição / concatenação de cadeias, subtração
5 <, >, <=, >= Comparação
6 ==, != Igualdade, desigualdade
7 && Lógica E
8 \|\| OU Lógico

O + operador concatena cadeias quando pelo menos um operando é uma cadeia. Usa parênteses para sobrepor a precedência padrão.

Importante

Use os operadores && lógicos simbólicos (AND), || (OR) e ! (NOT). A palavra-chave forma and, or, e not não é suportada. Por exemplo, escreva $1 == "a" || $1 == "b" em vez de $1 == "a" or $1 == "b".

Exemplos:

Expression Descrição
$1 * 2 ^ 3 Primeiro a exponenciar: $1 * 8
($1 * 2) ^ 3 Parênteses por sobreposição: multiplicar primeiro
-$1 * 2 Negação primeiro, depois multiplicação
$1 > 100 && $2 > 200 Condições de cadeia com AND lógico

Funções incorporadas

Funções de conversão unitária

Estas funções aceitam um único valor numérico e devolvem um float.

Função Conversão Formula
cToF(value) Celsius para Fahrenheit F = (C × 9/5) + 32
fToC(value) Fahrenheit para Celsius C = (F - 32) × 5/9
psiToBar(value) PSI para bar barra = PSI × 0,0689476
barToPsi(value) Bar para PSI PSI = barra / 0,0689476
inToCm(value) Polegadas a centímetros cm = em × 2,54
cmToIn(value) Centímetros a polegadas em = cm / 2,54
ftToM(value) Pés por metros m = ft × 0,3048
mToFt(value) Metros a pés ft = m / 0,3048
lbToKg(value) Libras por quilogramas kg = lb × 0,453592
kgToLb(value) Quilogramas para libras lb = kg / 0,453592
galToL(value) Galões americanos para litros L = gal × 3,78541
lToGal(value) Litros por galões americanos gal = L / 3,78541

Funções de escala e arredondamento

Função Descrição
scale(value, srcLo, srcHi, dstLo, dstHi) Escala value linearmente do intervalo de origem para o intervalo de destino. Os cinco argumentos devem ser numéricos.
round_n(value, decimals) Arredonda um flutuante para o número especificado de casas decimais (de 0 a 15).

Funções Matemáticas

Estas funções vêm da biblioteca matemática incorporada.

Função Descrição
floor(value) Maior número inteiro menor ou igual a um número
round(value) O inteiro mais próximo, arredondando a meio dos casos a partir de 0.0
ceil(value) Menor número inteiro maior ou igual a um número
math::abs(value) Valor absoluto
math::sqrt(value) Raiz quadrada (devolve NaN para números negativos)
math::cbrt(value) Raiz cúbica
math::ln(value) Logaritmo natural
math::log2(value) Logaritmo de base 2
math::log10(value) Logaritmo de base 10
math::log(value, base) Logaritmo com base arbitrária
math::exp(value) e elevado ao poder do valor
math::exp2(value) 2 elevado ao poder do valor
math::pow(base, exp) Eleva a base até ao poder de experiência
math::cos(value) Cosseno (radianos)
math::sin(value) Seno (radianos)
math::tan(value) Tangente (radianos)
math::acos(value) Arccosseno (devolve radianos)
math::asin(value) Arcsine (devolve radianos)
math::atan(value) Arctangente (devolve radianos)
math::atan2(y, x) Arco tangente de quatro quadrantes (devolve radianos)
math::hypot(a, b) Comprimento da hipotenusa em relação aos lados a e b

Funções de cadeia de caracteres

Função Descrição
len(string) Comprimento de carácter de uma cadeia, ou contagem de elementos de uma tupla
str::to_lowercase(string) Converte para minúsculas
str::to_uppercase(string) Converte para maiúsculas
str::trim(string) Remove espaços em branco à frente e à saída
str::from(value) Converte um valor para a sua representação de cadeia
str::substring(string, start, end) Extrai uma substring por índice de caracteres
str::regex_matches(string, pattern) Responde verdadeiro se a string coincidir com o padrão regex. Disponível apenas em gráficos de fluxo de dados.
str::regex_replace(string, pattern, replacement) Substitui todas as correspondências regulares pela corda de substituição. Disponível apenas em gráficos de fluxo de dados.

Funções de data e hora

As funções de data e hora estão disponíveis apenas nos gráficos de fluxo de dados. Exceto para parse_timestamp, as funções que aceitam um carimbo temporal requerem uma cadeia RFC 3339 . A cadeia deve incluir um deslocamento explícito em relação ao Tempo Universal Coordenado (UTC), como 2026-06-17T12:00:00Z ou 2026-06-17T12:00:00-08:00. A Returns coluna lista o tipo de resultado conceptual, que typeof reporta em minúsculas como "float", "int", ou "string".

Função Devoluções Descrição
duration_between(start, end, unit) float Calcula end - start com precisão de milissegundos. As unidades suportadas são "seconds", "millis", "minutes", "hours", e "days". Diferenças de retorno inferior a um milissegundo 0. O resultado é negativo quando end está pelo menos um milissegundo antes startde .
day_of_week(timestamp) int Devolve o dia da semana, onde é 0 domingo e sábado 6é .
hour_of_day(timestamp) int Devolve a hora de 0 até 23.
year_of(timestamp) int Devolve o ano civil.
month_of(timestamp) int Devolve o mês a partir de 1 .12
day_of_month(timestamp) int Devolve no dia do mês de 1 até 31.
minute_of_hour(timestamp) int Devolve o minuto de 0 através 59de .
second_of_minute(timestamp) int Devolve o segundo de 0 através 59de .
timezone_offset(timestamp) int Devolve o deslocamento do carimbo temporal do UTC em minutos. Por exemplo, -08:00 retorna -480 e +05:30 retorna 330.
now() string Devolve a hora UTC atual como carimbo RFC 3339 com precisão milissegundo.
format_timestamp(timestamp, pattern) string Formata um carimbo temporal RFC 3339 usando um strftime padrão.
parse_timestamp(value, pattern) string Analisa um valor usando um strftime padrão e devolve um carimbo temporal RFC 3339 UTC com precisão milissegundos.
from_epoch(value, unit) string Converte um valor da época Unix para um carimbo temporal RFC 3339 UTC com precisão de milissegundos. As unidades apoiadas são "seconds", "millis", e "micros". O valor pode ser um int ou float.
to_epoch(timestamp, unit) int Converte um carimbo temporal RFC 3339 para um inteiro da época Unix. As unidades apoiadas são "seconds", "millis", e "micros".

now() lê o relógio do sistema do nó Kubernetes que aloja a carga de trabalho do fluxo de dados cada vez que a função é executada. Chamadas na mesma expressão podem devolver valores diferentes. Numa regra de acumulação, now() devolve o momento em que a janela é processada, não quando chega uma mensagem de entrada. Para reduzir o desvio de relógio entre nós de cluster, sincronize cada relógio de nó com uma fonte de tempo fiável, como um servidor de Protocolo de Tempo de Rede.

Funções de calendário e relógio, como day_of_week, hour_of_day, e year_of, usam o deslocamento no carimbo temporal de entrada. Eles não convertem primeiro o valor para UTC. Os exemplos seguintes mostram este comportamento.

Expression Result
hour_of_day("2026-06-17T23:30:45-08:00") 23
day_of_week("2026-06-17T23:30:45-08:00") 3 (Quarta-feira)
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

Formatos e carimbos temporais de análise sintática

As format_timestamp funções e parse_timestamp usam strftime padrões. A tabela seguinte lista especificadores comuns.

Especificador Value
%Y Ano de quatro dígitos
%m Mês de dois dígitos
%d Dia do mês de dois dígitos
%H Hora em formato de 24 horas
%M Minuto
%S Second
%f Nanossegundos desde o último segundo inteiro, sem ponto decimal
%.f Segundos fracionários, incluindo a vírgula decimal
%z Deslocamento numérico UTC, como +0200
%:z Deslocamento numérico UTC com duas coisas, como +02:00

Para todos os especificadores suportados, consulte a documentação do Chrono strftime.

format_timestamp preserva o deslocamento do carimbo temporal da entrada. Por exemplo, format_timestamp("2026-06-09T14:00:00+02:00", "%Y-%m-%d %H:%M %:z") retorna "2026-06-09 14:00 +02:00".

parse_timestamp trata das entradas na seguinte ordem:

  1. Uma data e hora com um deslocamento numérico. A função honra o deslocamento e normaliza o resultado para UTC.
  2. Uma data e hora sem deslocação. A função assume UTC.
  3. Um encontro sem tempo. A função assume a meia-noite UTC.

Os exemplos seguintes mostram como parse_timestamp lida com cada tipo de entrada.

Expression 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"

Importante

parse_timestamp não suporta valores apenas de tempo ou abreviaturas de fuso horário como PST. Use %z ou %:z com um deslocamento numérico em vez de %Z. A análise normaliza os carimbos temporais para UTC, mas a formatação preserva o deslocamento de entrada. Portanto, as duas funções não são inversos exatos para valores que incluem um deslocamento não nulo.

Converter valores de época Unix

Usar from_epoch e to_epoch para converter entre valores de época Unix e carimbos de data RFC 3339.

Expression 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 aceita valores negativos para datas anteriores a 1 de janeiro de 1970. A sua saída tem precisão de milissegundos, pelo que converter microssegundos de época num carimbo temporal descarta precisão inferior a um milissegundo. to_epoch tem em conta o deslocamento UTC do carimbo temporal e arredonda valores anteriores a 1970 para o número inteiro seguinte inferior para a unidade selecionada.

Podem ser compostas funções de data e hora. Por exemplo, duration_between($1, now(), "days") calcula a idade em dias de um carimbo temporal do RFC 3339 fornecido como primeira introdução da regra. Para ler a hora de um carimbo de tempo após a converter para UTC, use hour_of_day(from_epoch(to_epoch($1, "micros"), "micros")).

Funções condicionais e de coleção

Função Descrição
if(condition, trueVal, falseVal) Retorna trueVal quando a condição é verdadeira, caso contrário falseVal
min(values) Mínimo de um ou mais valores numéricos ou um array
max(values) Máximo de um ou mais valores numéricos ou um array
contains(tuple, value) Retorna verdadeiro se a tupla contiver o valor
contains_any(tuple, candidates) Retorna verdadeiro se a tupla contiver algum valor da tupla do candidato
typeof(value) Devolve o tipo como uma cadeia: "string", "float", "int", "boolean", "tuple", ou "empty"

Funções de agregação (apenas transformadas de janela)

Estas funções estão disponíveis apenas em regras de acumulação dentro das transformadas de janela. Cada uma assume uma única variável posicional.

Função Devoluções Comportamento das janelas vazias
average($n) Média dos valores numéricos Erro
sum($n) Soma dos valores numéricos 0.0
min($n) Valor numérico mínimo Erro
max($n) Valor numérico máximo Erro
count($n) Contagem de mensagens onde o campo existe 0
first($n) Primeiro valor na janela Erro
last($n) Último valor na janela Erro

Para detalhes sobre a utilização de funções de agregação, veja Agregar dados ao longo do tempo.

Lógica condicional

Use a if função para ramificar a lógica dentro de uma expressão:

Expression Descrição
if($1 > 100, "high", "normal") Retorna "alta" quando a temperatura ultrapassa 100
if($2 == (), $1, $1 * $2) Volta para $1 quando faltam $2
if($1 > 5, true, false) Devolve um booleano baseado num limiar

Use () (o valor vazio) nas comparações para detetar campos em falta.

Sugestão

Se só precisares de um recurso estático para um campo em falta, a ?? <default> sintaxe é mais simples. Ver Valores padrão. Reserva if para casos em que precisas de escolher entre valores calculados.

Campos de metadados

Lê e escreve nos metadados da mensagem usando o $metadata. prefixo nos inputs campos or output de uma regra. As referências aos metadados vão no caminho do campo, não na expressão em si.

Propriedades de metadados

  • Tópico: Funciona tanto para MQTT quanto para Kafka. Ele contém a cadeia de caracteres onde a mensagem foi publicada. Exemplo: $metadata.topic.
  • Propriedade do usuário: No MQTT, isso se refere aos pares chave/valor de forma livre que uma mensagem MQTT pode carregar. Por exemplo, se a mensagem MQTT foi publicada com uma propriedade de utilizador com chave "prioridade" e valor "alto", então a $metadata.user_property.priority referência mantém o valor "alto". As chaves de propriedade do usuário podem ser cadeias de caracteres arbitrárias e podem exigir fuga: $metadata.user_property."weird key" usa a chave "chave estranha" (com um espaço).
  • Propriedade do sistema: este termo é usado para cada propriedade que não é uma propriedade do usuário. Atualmente, apenas uma única propriedade do sistema é suportada: $metadata.system_property.content_type, que lê a propriedade de tipo de conteúdo da mensagem MQTT (se definida).
  • Cabeçalho: Este é o equivalente na Kafka da propriedade do utilizador MQTT. Kafka pode usar qualquer valor binário para uma chave, mas os fluxos de dados suportam apenas chaves de cadeia UTF-8. Exemplo: $metadata.header.priority. Essa funcionalidade é semelhante às propriedades do usuário.
Campo Descrição
$metadata.topic O tema MQTT da mensagem
$metadata.user_property.<key> Uma propriedade de utilizador na mensagem, identificada por chave
$metadata.system_property.content_type A propriedade do sistema de tipos de conteúdo
$metadata.header.<key> Um valor de cabeçalho de Kafka, identificado por chave

Ler a partir dos metadados

Para referenciar o tópico de origem e uma propriedade de utilizador numa expressão, liste-os como entradas:

Entrada Variable
$metadata.topic $1
$metadata.user_property.device_id $2

Expressão: $1 + "/" + $2

No exemplo a seguir, a propriedade MQTT topic é mapeada para o campo origin_topic no resultado:

Entrada Output
$metadata.topic origin_topic

Se a propriedade priority user estiver presente na mensagem MQTT, o exemplo a seguir demonstra como mapeá-la para um campo de saída:

Entrada Output
$metadata.user_property.priority priority

Escrita para metadados

Para definir uma propriedade de utilizador na mensagem de saída, use $metadata.user_property.<key> como campo de saída.

Definir um campo de metadados para um valor vazio (()) remove-o. Para propriedades de utilizador, são permitidas chaves duplicadas.

Você também pode mapear propriedades de metadados para um cabeçalho de saída ou propriedade de usuário. No exemplo a seguir, o MQTT topic é mapeado para o campo origin_topic na propriedade de utilizador da saída.

Entrada Output
$metadata.topic $metadata.user_property.origin_topic

Se a carga de entrada contiver um priority campo, o exemplo a seguir demonstra como mapeá-lo para uma propriedade de usuário MQTT:

Entrada Output
priority $metadata.user_property.priority

O mesmo exemplo para Kafka:

Entrada Output
priority $metadata.header.priority

Os campos de metadados são suportados nas regras de mapa, filtro e ramos. Não estão disponíveis nas regras de janela (acumulação).

Último valor conhecido

Use o sufixo ? $last numa entrada para indicar ao tempo de execução que se lembre do valor mais recente desse campo. Se o campo estiver em falta na mensagem atual, é usado o último valor conhecido.

Entrada Comportamento
temperature ? $last Usa a última temperatura conhecida se a mensagem de corrente não temperature tiver campo

A ? $last diretiva é insensível a maiúsculas e minúsculas e suporta espaços em branco flexíveis.

Importante

Os últimos valores conhecidos são armazenados apenas na memória. Perdem-se quando o pod reinicia e não são partilhados entre réplicas.

O último valor conhecido é suportado nas regras de mapa, filtro e ramo. Não está disponível nas regras de janela (acumulação).

Valores padrão

Use o sufixo ?? <default> numa entrada para fornecer um valor de recurso, quando o campo estiver em falta. Tipos padrão suportados: inteiro, float, booleano, string e nulo.

Observação

A ?? <default> sintaxe está disponível apenas em gráficos de fluxo de dados. Não é suportado em entradas de fluxo builtInTransformation de dados.

Entrada Contingência
temperature ?? 0 Integer 0
status ?? "unknown" Corda "desconhecida"
threshold ?? 98.6 Float 98.6
enabled ?? true Booleano verdadeiro

Combinar o último valor conhecido e o padrão

Pode combinar ? $last e ?? <default>. O tempo de execução verifica primeiro a mensagem atual, depois o último valor conhecido e depois o predefinido. Se usares ?? <default> sem ? $last, o tempo de execução verifica diretamente a mensagem atual e depois o predefinido.

Entrada Ordem de avaliação
temperature ?? 0 Valor atual, então padrão (0)
temperature ? $last ?? 0 Valor atual, depois último conhecido, depois padrão (0)

Os valores padrão são suportados nas regras de mapa, filtro e ramos. Não estão disponíveis nas regras de janela (acumulação).

Tipos de dados

Tipo Descrição Exemplo
int Inteiro assinado de 64 bits 42, -7
Flutuar Ponto flutuante de 64 bits 3.14, -0.5
Cordão Texto UTF-8 "hello"
Bool booleano true, false
Tupla Array de valores primitivos (1, 2, 3)
Vazio Valor em falta ou nulo ()
JSON Objeto JSON passado (não pode ser usado em expressões)

Objetos e arrays JSON são preservados as-is quando os campos são copiados sem expressão, mas não podem ser usados como entradas para avaliação de expressões.

Suporte a funcionalidades por tipo de transformação

A mesma linguagem de expressões funciona entre transformadas, mas o resultado de uma expressão significa algo diferente em cada uma:

Transform O que o resultado da expressão faz
Map Produz o valor escrito para output
Filter Quando é verdade, a mensagem é descartada. Para manter as mensagens correspondentes, inverta a expressão.
Ramo Encaminha a mensagem para o true caminho ou.false Nada é deixado cair.
Janela (acumular) Produz o valor agregado para a janela
Feature Map Filter Ramo Janela (acumular)
Variáveis posicionais Sim Sim Sim Sim
Operadores Sim Sim Sim Sim
Funções incorporadas Sim Sim Sim Sim
Funções de agregação No No No Sim
$metadata Acesso Sim Sim Sim No
$context Enriquecimento Sim Sim Sim No
? $last Sim Sim Sim No
?? <default> ¹ Sim Sim Sim No
str::regex_matches / str::regex_replace ¹ Sim Sim Sim No
Wildcards Sim No No No

¹ Disponível apenas em gráficos de fluxo de dados. Não é suportado em entradas de fluxo builtInTransformation de dados.

Notação de pontos e escape

A notação de pontos é amplamente usada para referenciar campos aninhados. Um caminho padrão de notação pontual assemelha-se a Person.Address.Street.Number.

Num fluxo de dados, um caminho descrito por notação de pontos pode incluir cadeias e alguns caracteres especiais sem necessidade de escapar, como Person.Date of Birth.

Noutros casos, a fuga é necessária, por exemplo: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Este caminho, entre outros caracteres especiais, contém pontos dentro do nome do campo. Sem escapar, o nome do campo serviria como um separador na própria notação de pontos.

Enquanto um fluxo de dados analisa um caminho, ele trata apenas dois caracteres como especiais:

  • Os pontos (.) atuam como separadores de campo.
  • As aspas duplas, quando colocadas no início ou no fim de um segmento, iniciam uma secção escapada onde os pontos não são tratados como separadores de campo.

Quaisquer outros caracteres são tratados como parte do nome do campo. Essa flexibilidade é útil em formatos como JSON, onde os nomes de campo podem ser cadeias de caracteres arbitrárias.

A definição do caminho deve também cumprir as regras do formato de configuração. Quando uma personagem com significado especial é incluída no caminho, é necessária uma citação adequada. Por exemplo, nomes de campos que começam por dois pontos (como :Person:.:name:) ou que começam com um número seguido de texto (como 100 celsius.hot) precisam de ser citados na configuração para serem interpretados corretamente como cadeias de caracteres.

Fuga

A principal função de escapar num caminho notado por pontos é acomodar o uso de pontos que fazem parte dos nomes dos campos em vez de separadores. Por exemplo, o caminho Payload."Tag.10".Value consiste em três segmentos: Payload, Tag.10, e Value. As aspas duplas à volta Tag.10 impedem que o ponto atue como separador.

Escapando de regras na notação de pontos

  • Escape cada segmento separadamente: se vários segmentos contiverem pontos, esses segmentos devem ser colocados entre aspas duplas. Outros segmentos também podem ser citados, mas isso não afeta a interpretação do caminho. Por exemplo: Payload."Tag.10".Measurements."Vibration.$12".Value

  • Cita um segmento apenas quando for preciso escapar. Adicione aspas duplas à volta de um segmento apenas quando este contiver um ponto (ou outro carácter que, de outra forma, seria interpretado incorretamente como separador). Não cites um nome comum de campo.

    Por exemplo, para um corpo nomeado TagName dentro Recordsde :

    Faça isto Não isto
    Records.TagName Records."TagName"

    As aspas extra não ajudam e, em algumas ferramentas, como o editor de fluxo de dados de experiência operacional, passam a fazer parte do nome do campo. O mapeamento procura então um campo nomeado "TagName" (aspas incluídas), que não existe, por isso nada corresponde. Pode detetar isto na definição de fluxo de dados exportados, onde o nome aparece com aspas escapadas, como \"TagName\". Para corrigir, remova as aspas para que o nome fique apenas TagName.

  • Uso adequado de aspas duplas: aspas duplas devem abrir e fechar um segmento escapado. Quaisquer aspas no meio do segmento são consideradas parte do nome do campo. Por exemplo, o caminho Payload.He said: "Hello", and waved define dois campos: Payload e He said: "Hello", and waved. Quando um ponto aparece nestas circunstâncias, continua a servir como separador. Por exemplo, o caminho Payload.He said: "No. It is done" é dividido nos segmentos Payload, He said: "No, e It is done" (começando por um espaço).

Algoritmo de segmentação

  • Se o primeiro caractere de um segmento for uma aspa, o analisador procurará a próxima aspa. A cadeia de caracteres entre essas aspas é considerada um único segmento.
  • Se o segmento não começar com aspas, o analisador identificará segmentos procurando o próximo ponto ou o final do caminho.

Wildcards

Use um coringa (*) nos caminhos de entrada e saída para corresponder a vários campos ao mesmo tempo. Isto é útil quando a saída se assemelha muito à entrada, ou quando é necessário aplicar a mesma transformação em vários campos sem listar cada um deles.

Importante

Os exemplos de coringa nesta secção passam pelos campos que a entrada contigo. Para MQTT, Kafka e outras saídas JSON, isto é aceitável. Para um destino de armazenamento com serialização Parquet ou Delta, o esquema de saída deve declarar cada folha para a qual o curinga se expande. Se a carga útil em tempo de execução contiver um campo que o esquema não declara, o registo é eliminado. Gerar o esquema a partir de dados representativos de amostras e ver Comportamento de serialização de armazenamento.

Copiar todos os campos

Para passar todos os campos sem alterações:

Entrada Output
* *

Corresponde * a cada caminho de campo na entrada e coloca-o no mesmo caminho na saída. A parte do caminho que * corresponde chama-se segmento capturado. Na saída, o segmento capturado substitui o *.

Campos aninhados achatados

Para mover campos de um objeto aninhado para o nível raiz, coloque o prefixo na entrada e * na saída:

Entrada Output
Sensors.* *
Metadata.* *

Dado este input:

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

A saída achata ambos os objetos:

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

Reestruturação de campos

Para mover campos sob um novo pai, coloque * a entrada e adicione um prefixo na saída:

Entrada Output
* Telemetry.*

Isto envolve todos os campos de topo dentro de um Telemetry objeto.

Regras de colocação de wildcard

  • é permitido um* por caminho de entrada ou saída.
  • Devem * corresponder a um segmento completo (não a um segmento parcial como Sensor*).
  • Podem * aparecer no início (*.Value), no meio (Sensors.*.Reading) ou no fim (Sensors.*) de um caminho.

Curingas de entrada múltipla

Quando uma regra tem múltiplas entradas com curingas, é * necessário capturar o mesmo segmento em todas as entradas. O tempo de execução resolve o * a partir da primeira entrada, depois procura caminhos correspondentes nas outras entradas.

Por exemplo, para fazer a média das leituras máximas e mínimas de cada sensor:

Entrada Output Expression
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2

Dado este input:

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

As * capturas Temperature primeiro, por isso a regra procura tanto Temperature.Max como Temperature.Min. Depois captura Pressure e procura Pressure.Max e Pressure.Min. A saída é:

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

Se qualquer entrada não conseguir resolver para um segmento capturado (por exemplo, *.Mid.Avg quando o campo está aninhado de forma diferente), esse segmento é ignorado. Certifique-se de que os caminhos em todas as entradas refletem a estrutura real dos dados.

Anule um coringa para campos específicos

Podes combinar uma regra de wildcard com regras específicas. Regras específicas têm prioridade quando têm uma cobertura menor (menos segmentos correspondidos por *). Isto chama-se especialização.

Entrada Output Expression
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2
Pressure.Max ($1)
Pressure.Min ($2)
Averaged.PressureAdj ($1 + $2 + 1.0) / 2

A primeira regra aplica-se a todas as áreas. A segunda regra sobrepõe-se apenas para Pressure isso, porque Pressure.Max é mais específica do que *.Max (cobertura 0 vs. cobertura 1).

Para excluir completamente um campo, use uma saída vazia:

Entrada Output
Pressure.Max, Pressure.Min (vazio)

Uma saída vazia elimina o campo do resultado. Isto sobrepõe-se a qualquer regra de wildcard que de outra forma o incluiria.

Múltiplas regras nas mesmas entradas

Se duas regras tiverem a mesma ou superior cobertura, ambas se aplicam. Isto permite-lhe calcular múltiplos valores derivados das mesmas entradas:

Entrada Output Expression
*.Max ($1)
*.Min ($2)
Stats.*.Avg ($1 + $2) / 2
*.Max ($1)
*.Min ($2)
Stats.*.Range $1 - $2

Ambas as regras executam-se para cada segmento capturado, produzindo dois campos de saída por sensor.

Curingas em conjuntos de dados de contextualização

Pode usar curingas com $context referências para copiar todos os campos de um conjunto de dados:

Entrada Output
$context(assetMeta).* Asset.*

Isto copia todos os campos do assetMeta conjunto de dados para a Asset secção do resultado.

Conjuntos de dados de contextualização

Conjuntos de dados de contextualização permitem que os mapeamentos integrem dados extra de bases de dados externas. Use o $context(datasetName) prefixo para referenciar campos de um conjunto de dados. Por exemplo, $context(position).BaseSalary lê o BaseSalary campo de um conjunto de dados chamado position.

Para detalhes sobre a configuração de conjuntos de dados de contextualização, veja Enriquecer dados usando fluxos de dados e Enriquecer com dados externos em grafos de fluxo de dados.

Se chegou aqui à procura da sintaxe usada numa transformação específica, estes artigos mostram expressões em contexto:

Para fazê-lo Veja
Renomear, reestruturar ou computar campos, incluindo conversões de unidades como cToF Transformar dados com mapeamento em gráficos de fluxo de dados
Deixa as mensagens de lado ou encaminha-as por caminhos diferentes com uma condição Filtrar e encaminhar dados em grafos de fluxo de dados
Calcular médias, somas ou contagens ao longo de uma janela temporal Dados agregados ao longo do tempo
Procura dados de referência na loja do estado Enriquecer com dados externos
Definir o tópico MQTT de saída a partir do conteúdo da mensagem Encaminhe mensagens para diferentes tópicos
Construir o pipeline que contém estas transformações Dados de processo com grafos de fluxo de dados

Para fluxos de dados, veja Mapear dados usando fluxos de dados e Filtrar dados num fluxo de dados.