Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Uma data e hora com um deslocamento numérico. A função respeita o deslocamento e normaliza o resultado para UTC.
- Uma data e hora sem deslocamento. A função assume UTC.
- 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.priorityreferê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".ValueCite 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
TagNamedentroRecordsde :Faça isto Não é isso Records.TagNameRecords."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 apenasTagName.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 waveddefine dois campos:PayloadeHe said: "Hello", and waved. Quando um ponto aparece nessas circunstâncias, ele continua a servir como separador. Por exemplo, o caminhoPayload.He said: "No. It is done"é dividido nos segmentosPayloadHe said: "NoeIt 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 comoSensor*). - 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.
Conteúdo relacionado
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.