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

Essa referência se aplica a fluxos de dados e grafos de fluxo de dados. Ambos usam a mesma linguagem de expressão para transformações de mapa, filtro e enriquecimento. Os grafos de fluxo de dados também dão suporte a transformações de ramificação e janela (acumulação), que são anotadas quando aplicável.

Variáveis posicionais

A matriz de inputs cada regra determina as variáveis disponíveis no expression. A primeira entrada se torna $1, a segunda se torna $2e assim por diante.

Entradas Expression Resultado
Position, Office $1 + ", " + $2 Concatena Posição e Office com uma vírgula
temperature cToF($1) Converte Celsius em Fahrenheit
temperature, humidity $1 * $2 < 100000 Verifica um limite em relação a dois campos

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

Operadores

As expressões dão suporte aos seguintes operadores, listados da precedência mais alta para a mais baixa:

Precedence Operadores Descrição
1 ! LOGIC NOT (unary)
2 ^ Exponenciação
3 *, , /% Multiplicação, divisão, modulo
4 +, - Concatenação de adição/cadeia de caracteres, subtração
5 <, >, , <=>= Comparação
6 ==, != Igualdade, desigualdade
7 && AND lógico
8 \|\| OR lógico

O + operador concatena cadeias de caracteres quando pelo menos um operando é uma cadeia de caracteres. Use parênteses para substituir 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 Exponencialização primeiro: $1 * 8
($1 * 2) ^ 3 Substituição de parênteses: multiplique primeiro
-$1 * 2 Negação primeiro e, em seguida, multiplicar
$1 > 100 && $2 > 200 Condições de cadeia com AND lógico

Funções internas

Funções de conversão de unidade

Essas funções aceitam um único valor numérico e retornam 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 bar = PSI × 0,0689476
barToPsi(value) Bar para PSI PSI = bar/0,0689476
inToCm(value) Polegadas a centímetros cm = em × 2,54
cmToIn(value) Centímetros a polegadas in = cm / 2,54
ftToM(value) Pés a metros m = ft × 0,3048
mToFt(value) Metros a pés ft = m / 0,3048
lbToKg(value) Libras a quilogramas kg = lb × 0,453592
kgToLb(value) Quilogramas em libras lb = kg / 0,453592
galToL(value) Galões dos EUA para litros L = gal × 3,78541
lToGal(value) Litros para galões dos EUA gal = L / 3,78541

Funções de dimensionamento e arredondamento

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

Funções matemáticas

Essas funções vêm da biblioteca de matemática interna.

Função Descrição
floor(value) Maior inteiro menor ou igual a um número
round(value) Inteiro mais próximo, arredondando casos de meio caminho para longe de 0,0
ceil(value) Menor inteiro maior ou igual a um número
math::abs(value) Valor absoluto
math::sqrt(value) Raiz quadrada (retorna NaN para números negativos)
math::cbrt(value) Raiz do cubo
math::ln(value) Logaritmo natural
math::log2(value) Logaritmo base-2
math::log10(value) Logaritmo 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 ao poder do exp
math::cos(value) Cosseno (radianos)
math::sin(value) Seno (radianos)
math::tan(value) Tangente (radianos)
math::acos(value) Arccosina (retorna radianos)
math::asin(value) Arcsina (retorna radianos)
math::atan(value) Arctangent (retorna radianos)
math::atan2(y, x) Arcotangente de quatro quadrantes (retorna radianos)
math::hypot(a, b) Comprimento da hipotenusa dos lados a e b

Funções de cadeia de caracteres

Função Descrição
len(string) Comprimento do caractere de uma cadeia de caracteres ou contagem de elementos de uma tupla
str::to_lowercase(string) Converte em minúsculas
str::to_uppercase(string) Converte em maiúsculas
str::trim(string) Remove o espaço em branco à esquerda e à direita
str::from(value) Converte um valor em sua representação de cadeia de caracteres
str::substring(string, start, end) Extrai uma subcadeia de caracteres por índice de caracteres
str::regex_matches(string, pattern) Retornará true se a cadeia de caracteres corresponder ao padrão regex. Disponível somente em grafos de fluxo de dados.
str::regex_replace(string, pattern, replacement) Substitui todas as correspondências regex pela cadeia de caracteres de substituição. Disponível somente em grafos de fluxo de dados.

Funções de data e hora

Funções de data e hora estão disponíveis apenas em gráficos de fluxo de dados. Exceto por parse_timestamp, funções que aceitam um carimbo de tempo requerem uma string 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 conceitual, que typeof relata 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. Unidades suportadas são "seconds", "millis", "minutes", "hours", e "days". Diferenças de retorno 0de menos de um milissegundo . O resultado é negativo quando end está pelo menos um milissegundo antes startde .
day_of_week(timestamp) int Retorna no dia da semana, onde é 0 domingo e sábado 6é .
hour_of_day(timestamp) int Retorna a hora de 0 até 23.
year_of(timestamp) int Retorna o ano civil.
month_of(timestamp) int Devolve o mês a 1 partir de .12
day_of_month(timestamp) int Devolve no dia do mês de 1 até 31.
minute_of_hour(timestamp) int Retorna o minuto de 0 através 59de .
second_of_minute(timestamp) int Retorna o segundo de 0 através 59de .
timezone_offset(timestamp) int Retorna o deslocamento do carimbo de hora do UTC em minutos. Por exemplo, -08:00 retorna -480 e +05:30 retorna 330.
now() string Retorna o horário UTC atual como um carimbo de tempo RFC 3339 com precisão de milissegundos.
format_timestamp(timestamp, pattern) string Formata um carimbo de data e hora do RFC 3339 usando um strftime padrão.
parse_timestamp(value, pattern) string Analisa um valor usando um strftime padrão e retorna um carimbo de tempo RFC 3339 UTC com precisão milissegundos.
from_epoch(value, unit) string Converte um valor da época Unix para um carimbo de tempo RFC 3339 UTC com precisão milissegundos. Unidades apoiadas são "seconds", "millis", e "micros". O valor pode ser um int ou float.
to_epoch(timestamp, unit) int Converte um carimbo de tempo RFC 3339 em um inteiro da época Unix. Unidades apoiadas são "seconds", "millis", e "micros".

now() lê o clock do sistema do nó Kubernetes que hospeda a carga de trabalho do fluxo de dados a cada execução da função. Chamadas na mesma expressão podem devolver valores diferentes. Em uma regra de acumulação, retorna now() o momento em que a janela é processada, não quando uma mensagem de entrada chega. Para reduzir o desfasamento de clock entre os nós do cluster, sincronize o clock de cada nó com uma fonte de tempo confiá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 de hora de entrada. Eles não convertem o valor para UTC primeiro. Os exemplos a seguir mostram esse comportamento.

Expression Resultado
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 de tempo de análise

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

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

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

format_timestamp preserva o deslocamento do carimbo de tempo de 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 lida com as entradas na seguinte ordem:

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

Os exemplos a seguir mostram como parse_timestamp lida com 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 não suporta valores apenas de tempo ou abreviações 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 de tempo 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

Use from_epoch e to_epoch para converter entre valores de época Unix e carimbos de data e horário 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 aceita valores negativos para datas anteriores a 1º de janeiro de 1970. Sua saída tem precisão de milissegundos, então converter microssegundos de época em um carimbo de tempo descarta precisão abaixo de um milissegundo. to_epoch leva em conta o deslocamento UTC do carimbo de tempo e arredonda valores anteriores a 1970 para o número inteiro seguinte inferior para a unidade selecionada.

Funções de data e hora podem ser compostas. Por exemplo, duration_between($1, now(), "days") calcula a idade em dias de um carimbo de data do RFC 3339 fornecido como a primeira entrada da regra. Para ler a hora de um carimbo de tempo após convertê-lo 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 uma matriz
max(values) Máximo de um ou mais valores numéricos ou uma matriz
contains(tuple, value) Retorna true se a tupla contiver o valor
contains_any(tuple, candidates) Retornará true se a tupla contiver qualquer valor da tupla de candidatos
typeof(value) Retorna o tipo como uma cadeia de caracteres: "string", , "float", "int", "boolean", "tuple"ou "empty"

Funções de agregação (somente transformações de janela)

Essas funções estão disponíveis apenas em regras de acúmulo dentro de transformações de janela. Cada um usa uma única variável posicional.

Função Devoluções Comportamento de janela vazio
average($n) Média de valores numéricos Erro
sum($n) Soma de 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 em que o campo existe 0
first($n) Primeiro valor na janela Erro
last($n) Último valor na janela Erro

Para obter detalhes sobre como usar funções de agregação, consulte 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 "alto" quando a temperatura excede 100
if($2 == (), $1, $1 * $2) Cai para $1 quando $2 está faltando
if($1 > 5, true, false) Retorna um booliano com base em um limite

Use () (o valor vazio) em comparações para detectar campos ausentes.

Dica

Se você precisar apenas de um fallback estático para um campo ausente, a ?? <default> sintaxe será mais simples. Consulte valores padrão. Reserve if para casos em que você precisa escolher entre valores computados.

Campos de metadados

Leia e escreva em metadados de mensagem usando o $metadata. prefixo nos campos ou inputs nos output campos de uma regra. As referências de metadados vão para o caminho do campo, não na própria expressão.

Propriedades de metadados

  • Tópico: Funciona para ambos MQTT e Kafka. Contém a cadeia de caracteres em que a mensagem foi publicada. Exemplo: $metadata.topic.
  • Propriedade do usuário: No MQTT, refere-se aos pares de chave/valor de forma livre que uma mensagem MQTT pode conter. Por exemplo, se a mensagem MQTT foi publicada com uma propriedade de usuário com a chave "priority" e o valor "high", 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 escape: $metadata.user_property."weird key" usa a chave "weird key" (com um espaço).
  • Propriedade do sistema: Esse termo é usado para cada propriedade que não é uma propriedade do usuário. No momento, só há suporte para uma única propriedade do sistema: $metadata.system_property.content_type, que lê a propriedade do tipo de conteúdo da mensagem MQTT (se definida).
  • Cabeçalho: Esse é o equivalente no Kafka da propriedade de usuário do MQTT. O Kafka pode usar qualquer valor binário para uma chave, mas os fluxos de dados dão suporte apenas a chaves de cadeia de caracteres UTF-8. Exemplo: $metadata.header.priority. Essa funcionalidade é semelhante às propriedades do usuário.
Campo Descrição
$metadata.topic O tópico MQTT da mensagem
$metadata.user_property.<key> Uma propriedade do usuário na mensagem, identificada por chave
$metadata.system_property.content_type A propriedade do sistema de tipo de conteúdo
$metadata.header.<key> Um valor de cabeçalho Kafka, identificado por chave

Leitura de metadados

Para fazer referência ao tópico de origem e a uma propriedade do usuário em uma 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 topic do MQTT é mapeada para o campo origin_topic na saída:

Entrada Saída
$metadata.topic origin_topic

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

Entrada Saída
$metadata.user_property.priority priority

Gravar em metadados

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

Definir um campo de metadados como um valor vazio (()) o remove. Para propriedades do usuário, chaves duplicadas são permitidas.

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

Entrada Saída
$metadata.topic $metadata.user_property.origin_topic

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

Entrada Saída
priority $metadata.user_property.priority

O mesmo exemplo para o Kafka:

Entrada Saída
priority $metadata.header.priority

Há suporte para campos de metadados em regras de mapa, filtro e branch. Elas não estão disponíveis em regras de janela (acumulação).

Último valor conhecido

Use o ? $last sufixo em uma entrada para dizer ao runtime para lembrar o valor mais recente desse campo. Se o campo estiver ausente na mensagem atual, o último valor conhecido será usado.

Entrada Comportamento
temperature ? $last Usará a última temperatura conhecida se a mensagem atual não tiver campo temperature

A ? $last diretiva não diferencia maiúsculas de minúsculas e dá suporte ao espaço em branco flexível.

Importante

Os últimos valores conhecidos são armazenados somente na memória. Eles são perdidos quando o pod é reiniciado e não são compartilhados entre réplicas.

Há suporte para o último valor conhecido nas regras de mapa, filtro e branch. Ele não está disponível em regras de janela (acumulação).

Valores padrão

Use o ?? <default> sufixo em uma entrada para fornecer um valor de fallback quando o campo estiver ausente. Tipos padrão com suporte: inteiro, float, booliano, cadeia de caracteres e nulo.

Observação

A ?? <default> sintaxe está disponível somente em grafos de fluxo de dados. Não há suporte para ele em entradas de fluxo builtInTransformation de dados.

Entrada Alternativa
temperature ?? 0 Inteiro 0
status ?? "unknown" Cadeia de caracteres "desconhecida"
threshold ?? 98.6 Float 98.6
enabled ?? true Booliano verdadeiro

Combinar o último valor conhecido e o padrão

Você pode combinar ? $last e ?? <default>. O runtime verifica a mensagem atual primeiro, depois o último valor conhecido e, em seguida, o padrão. Se você usar ?? <default> sem ? $last, o runtime verificará a mensagem atual e, em seguida, o padrão diretamente.

Entrada Ordem de avaliação
temperature ?? 0 Valor atual e, em seguida, padrão (0)
temperature ? $last ?? 0 Valor atual, então conhecido pela última vez e, em seguida, padrão (0)

Os valores padrão têm suporte nas regras de mapa, filtro e branch. Elas não estão disponíveis em 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
String Texto UTF-8 "hello"
Bool booleano true, false
Tuplo Matriz de valores primitivos (1, 2, 3)
Vazio Valor ausente ou nulo ()
JSON Objeto JSON passado (não pode ser usado em expressões)

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

Suporte a recursos 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:

Transformar O que o resultado da expressão faz
Mapa Produz o valor escrito em output
Filter Quando é verdade, a mensagem é descartada. Para manter mensagens correspondentes, inverta a expressão.
Ramo Encaminha a mensagem para o true caminho ou false . Nada é descartado.
Janela (acumular) Produz o valor agregado para a janela
Característica Mapa Filter Ramo Janela (acumular)
Variáveis posicionais Sim Sim Sim Sim
Operadores Sim Sim Sim Sim
Funções internas 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
Curingas Sim No No No

¹ Disponível somente em grafos de fluxo de dados. Não há suporte em entradas de fluxo builtInTransformation de dados.

Notação de ponto e escape

A notação de ponto é amplamente usada para referenciar campos aninhados. Um caminho de notação de ponto padrão se parece Person.Address.Street.Numbercom .

Em um fluxo de dados, um caminho descrito por notação de ponto pode incluir cadeias de caracteres e alguns caracteres especiais sem a necessidade de escape, como Person.Date of Birth.

Em outros casos, o escape é necessário, por exemplo: nsu=http://opcfoundation.org/UA/Plc/Applications;s=RandomSignedInt32. Esse caminho, entre outros caracteres especiais, contém os ponto dentro do nome do campo. Sem escapar, o nome do campo serviria como um separador na notação de ponto em si.

Embora um fluxo de dados analise um caminho, ele trata apenas dois caracteres como especiais:

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

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

A definição do caminho também deve seguir as regras do formato de configuração. Quando um caractere com significado especial é incluído no caminho, aspas adequadas são necessárias. Por exemplo, os nomes de campo que começam com dois-pontos (como :Person:.:name:) ou que começam com um número seguido de texto (como 100 celsius.hot) precisam de aspas na configuração para serem interpretados corretamente como cadeias de caracteres.

Escapando

A função primária de escape em um caminho com notação de ponto é acomodar o uso de ponto que fazem parte de nomes de campo em vez de separadores. Por exemplo, o caminho Payload."Tag.10".Value consiste em três segmentos: Payload, Tag.10e Value. As aspas duplas ao redor Tag.10 impedem que o ponto atue como um separador.

Regras de escape na notação de ponto

  • Escape cada segmento separadamente: se vários segmentos contiverem pontos, esses segmentos deverão 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

  • Cite um segmento apenas quando ele precisar escapar. Adicione aspas duplas ao redor de um segmento apenas quando ele contiver um ponto (ou outro caractere que, de outra forma, seria interpretado erroneamente como separador). Não cite um nome comum de campo.

    Por exemplo, para um corpo nomeado TagName dentro Recordsde :

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

    As aspas extras não ajudam, e em algumas ferramentas, como o editor de fluxo de dados de experiência operacional, elas passam a fazer parte do nome do campo. O mapeamento então procura um campo nomeado "TagName" (aspas incluídas), que não existe, então nada bate. Você pode identificar isso 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. As 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 nessas circunstâncias, ele continua a servir como separador. Por exemplo, o caminho Payload.He said: "No. It is done" é dividido nos segmentos PayloadHe said: "Noe It is done" (começando com um espaço).

Algoritmos 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 uma aspa, o analisador identificará segmentos pesquisando o próximo ponto ou o final do caminho.

Curingas

Use um curinga (*) em caminhos de entrada e saída para corresponder a vários campos ao mesmo tempo. Isso é útil quando a saída se assemelha muito à entrada ou quando você precisa aplicar a mesma transformação em muitos campos sem listar cada um deles.

Importante

Os exemplos de coringa nesta seção passam por quaisquer campos que a entrada contiga. Para MQTT, Kafka e outras saídas JSON, isso é 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 de runtime contiver um campo que o esquema não declara, o registro é descartado. Gerar o esquema a partir de dados representativos de amostra e ver Comportamento de serialização de armazenamento.

Copiar todos os campos

Para passar todos os campos por inalterado:

Entrada Saída
* *

Corresponde * a cada caminho de campo na entrada e o coloca no mesmo caminho na saída. A parte do caminho correspondente * é chamada de segmento capturado. Na saída, o segmento capturado substitui o *.

Nivelar campos aninhados

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

Entrada Saída
Sensors.* *
Metadata.* *

Considerando esta entrada:

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

A saída nivela ambos os objetos:

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

Reestruturar campos

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

Entrada Saída
* Telemetry.*

Isso encapsula todos os campos de nível superior dentro de um Telemetry objeto.

Regras de posicionamento curinga

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

Curingas de entradas múltiplas

Quando uma regra tem várias entradas com curingas, ela * deve capturar o mesmo segmento em todas as entradas. O runtime resolve a * partir da primeira entrada e procura caminhos correspondentes nas outras entradas.

Por exemplo, para média das leituras máxima e mínima para cada sensor:

Entrada Saída Expression
*.Max ($1)
*.Min ($2)
Averaged.* ($1 + $2) / 2

Considerando esta entrada:

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

A * captura Temperature primeiro, de modo que a regra procura por ambos Temperature.Max e Temperature.Min. Em seguida, ele captura Pressure e procura Pressure.Max e Pressure.Min. A saída é:

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

Se qualquer entrada não puder ser resolvida para um segmento capturado (por exemplo, *.Mid.Avg quando o campo estiver aninhado de forma diferente), esse segmento será ignorado. Verifique se os caminhos em todas as entradas refletem a estrutura real dos dados.

Substituir um curinga para campos específicos

Você pode combinar uma regra curinga com regras específicas. Regras específicas têm precedência quando têm uma cobertura menor (menos segmentos correspondentes por *). Isso é chamado de especialização.

Entrada Saída 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 se aplica a todos os campos. A segunda regra substitui-a apenas porque PressurePressure.Max é mais específica do que *.Max (cobertura 0 versus cobertura 1).

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

Entrada Saída
Pressure.Max, Pressure.Min (vazio)

Uma saída vazia remove o campo do resultado. Isso substitui qualquer regra curinga que, de outra forma, a incluiria.

Várias regras nas mesmas entradas

Se duas regras tiverem a mesma cobertura ou maior, ambas se aplicarão. Isso permite calcular vários valores derivados das mesmas entradas:

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

Ambas as regras são executadas para cada segmento capturado, produzindo dois campos de saída por sensor.

Caracteres curinga em conjuntos de dados de contextualização

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

Entrada Saída
$context(assetMeta).* Asset.*

Isso copia todos os campos do conjunto de assetMeta dados para a Asset seção da saída.

Conjuntos de dados de contextualização

Os conjuntos de dados de contextualização permitem que os mapeamentos integrem dados extras de bancos de dados externos. 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 obter detalhes sobre como configurar conjuntos de dados de contextualização, consulte Enriquecer dados usando fluxos de dados e Enriquecer com dados externos em grafos de fluxo de dados.

Se você chegou aqui procurando a sintaxe usada em uma transformação específica, estes artigos mostram expressões em contexto:

Para fazer isso Veja
Renomear, reestruturar ou computar campos, incluindo conversões de unidades como cToF Transformar dados com mapa em grafos de fluxo de dados
Deixe mensagens de lado ou encaminhe-as por caminhos diferentes com uma condição Filtrar e rotear dados em grafos de fluxo de dados
Calcule médias, somas ou contagens ao longo de uma janela de tempo Agregar dados ao longo do tempo
Procure dados de referência na loja estadual Enriquecer com dados externos
Defina o tópico MQTT de saída a partir do conteúdo da mensagem Rotear mensagens para tópicos diferentes
Construa o pipeline que contém essas transformações Dados de processo com gráficos de fluxo de dados

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