Este tópico descreve as regras de sintaxe e as funções integradas do módulo Transform para jobs de ingestão de dados do Flink CDC.
Parâmetros de regras do Transform
O módulo Transform permite a manipulação direta de colunas de dados. Exclua ou estenda colunas existentes e filtre dados indesejados durante a sincronização de dados. Use os seguintes parâmetros para definir as regras do Transform:
|
Parâmetro |
Descrição |
Obrigatório |
Observações |
|
|
Especifique a tabela upstream para a transformação. |
Sim |
Aceita expressões regulares. |
|
|
Especifique a regra de projeção para a tabela upstream. Isso define todas as colunas de dados após a transformação. |
Não |
A sintaxe é semelhante à da instrução SELECT do SQL. Se você não especificar esse parâmetro, o sistema não adiciona colunas; não exclua colunas. Para mais informações, consulte Data screening. Para obter detalhes sobre as funções integradas disponíveis, consulte Flink CDC built-in functions. |
|
|
Regra de filtragem de linhas. |
Não |
A sintaxe é semelhante à da instrução WHERE do SQL. Se omitido, o sistema não filtrará nenhuma linha. |
|
|
Especifique as colunas de chave primária após a transformação. |
Não |
Se você não especificar esse parâmetro, o sistema manterá a definição de chave primária do schema original. Separe as chaves primárias com vírgulas ( Importante
Por padrão, não exclua colunas de chave primária do upstream. Adicione o parâmetro Ao definir colunas de chave primária personalizadas, certifique-se de que os dados recebidos da tabela upstream estejam em conformidade com a restrição PRIMARY KEY. Para evitar problemas de desordem de dados durante gravações entre partições, recomendamos incluir as colunas de chave primária da tabela upstream nas colunas personalizadas. |
|
|
Especifique a lista de colunas de chave de partição após a transformação. |
Não |
Caso você não especifique esse parâmetro, o sistema manterá a definição de chave de partição do schema original. Separe as chaves de partição com vírgulas ( Importante
Ao definir colunas de chave de partição personalizadas, certifique-se de que os dados recebidos da tabela upstream estejam em conformidade com a restrição PRIMARY KEY para evitar problemas de desordem de dados durante gravações entre partições. |
|
|
Transmite informações adicionais de configuração para o sink. |
Não |
Uma lista de propriedades opcionais, como o número de buckets para um sink Paimon ou comentários. Separe os itens de configuração com vírgulas ( Exemplo de configuração:
|
|
|
Descrição da regra do Transform. |
Não |
Nenhuma. |
|
|
Conversor que executa processamento adicional nos dados após a conclusão da transformação. |
Não |
Para mais informações, consulte Converter after Transform. |
Observações
Modifique uma instrução no módulo Transform e reinicie o job a partir de um estado inicial sem estado (stateless).
-
Em geral, as instruções
projectionefilternão precisam estar entre aspas.transform: - projection: a, b, c # Equivalent to - projection: "a, b, c"No entanto, se uma expressão de projeção começar com um caractere especial, como
*ou', o sistema pode não analisar a expressão inteira como um literal de string YAML válido. Nesse caso, envolva manualmente toda a expressão entre aspas simples (') ou duplas ("), ou use uma barra invertida (\) para escapar o caractere.transform: - projection: *, 42 # Not valid YAML - projection: '*, 42' # OK - projection: \*, 42 # OK -
A partir do Ververica Runtime (VVR) 11.6, você pode limpar as configurações de chave primária inferidas do upstream e converter a tabela em uma tabela sem chave primária. Use a seguinte sintaxe:
transform: - source-table: db.tbl primary-keys: '' # Clears the PRIMARY KEY setting for the db.tbl table
Seleção de dados
O módulo Transform usa uma sintaxe semelhante à do SQL para definir regras de seleção (projeção) de dados. Essas regras permitem que você selecione colunas específicas, além de adicionar colunas calculadas e de metadados.
Poda de colunas
Para extrair colunas específicas da tabela source e sincronizá-las com o downstream, especifique as colunas desejadas na regra de projeção. O sistema não envia as colunas não especificadas para o downstream.
transform:
- source-table: db.tbl
projection: col_1, col_3, col_4 # col_2 is pruned
A poda de colunas pode fazer com que os schemas das tabelas upstream e downstream fiquem inconsistentes caso o schema da tabela upstream sofra alterações.
Caracteres curinga
Para enviar todas as colunas da tabela source, incluindo quaisquer novas colunas adicionadas posteriormente, para o downstream sem modificações, use o caractere curinga asterisco (*) na regra de projeção.
Se uma regra de projeção não usar um caractere curinga (*), o schema resultante será fixo. O schema permanece consistente com a versão especificada na regra de projeção, e o sistema não pode sincronizar a evolução do schema.
Por exemplo, *, 'extras' AS extras indica que o sistema adiciona uma coluna extra após as colunas do schema upstream. O sistema ainda sincroniza a evolução do schema upstream com o downstream.
transform:
- source-table: db.tbl
projection: \*, 'extras' AS extras
Colunas calculadas
Use a sintaxe <Expression> AS <ColName> em uma regra de projeção para adicionar uma coluna calculada. O sistema avalia a expressão para cada registro do upstream e preenche a coluna correspondente com o resultado.
A expressão de uma coluna calculada não pode referenciar o valor de outra coluna calculada, mesmo que a coluna referenciada apareça antes dela. Por exemplo, a, b AS c, c AS d não é uma expressão válida.
Por exemplo, quando a tabela upstream db.tbl envia o registro de dados [+I, id = 1], o sistema transforma o registro na linha de dados [+I, id = 1, inc_id = 2] e, em seguida, o envia para o downstream.
transform:
- source-table: db.tbl
projection: id, id + 1 AS inc_id
Colunas de metadados
Ao escrever regras de projeção, use as seguintes colunas de metadados predefinidas da mesma forma que as colunas de dados regulares:
Não defina colunas de dados regulares com os mesmos nomes das colunas de metadados.
As seguintes colunas de metadados se aplicam a todos os conectores.
|
Nome da coluna de metadados |
Tipo de dados |
Descrição |
|
|
String |
O nome do namespace da tabela source para este registro de alteração. |
|
|
String |
O nome do schema da tabela source para este registro de alteração. |
|
|
String |
O nome da tabela source para este registro de alteração. |
|
|
String |
O tipo de operação para este registro de alteração ( Importante
Um evento CDC sempre empacota os registros Update Before e Update After de uma atualização em um único evento. Portanto, o conteúdo de |
Por exemplo, grave o nome totalmente qualificado da tabela upstream em uma coluna calculada e envie-o para o downstream.
transform:
- source-table: \.*.\.*
projection: \*, __namespace_name__ || __schema_name__ || __table_name__ AS identifier
A tabela a seguir mostra as relações de mapeamento entre os conectores de banco de dados e os nomes de namespace, schema e tabela.
|
Tipo de banco de dados |
Nome do namespace |
Nome do schema |
Nome da tabela |
|
MySQL |
- |
Database |
Table |
|
Kafka |
- |
- |
Topic |
|
SLS |
- |
Project |
LogStore |
|
MongoDB |
- |
Database |
Collection |
|
Paimon |
- |
Database |
Table |
|
Hologres |
- |
Schema |
Table |
|
StarRocks |
- |
Database |
Table |
|
Doris |
- |
Database |
Table |
|
Postgres |
Database Nota
Isso é válido apenas quando o parâmetro |
Schema |
Table |
Filtragem de dados
O módulo Transform usa uma sintaxe semelhante à do SQL para definir regras de filtragem de linhas.
A regra de filtro deve ser uma expressão avaliada como um valor BOOLEAN. Ela pode referenciar qualquer coluna da tabela source e quaisquer colunas calculadas.
Se um registro de alteração corresponder a uma regra do Transform com um filtro e a expressão do filtro for avaliada como FALSE, o sistema não enviará a linha de dados para o downstream.
Se você usar uma coluna calculada em uma regra de projeção para sobrescrever uma coluna upstream existente, a expressão do filtro referenciará a coluna calculada.
Por exemplo, a seguinte regra do Transform é válida:
transform:
- source-table: db.tbl
projection: CAST(id AS VARCHAR) AS id
filter: CHAR_LENGTH(id) > 5
O id referenciado na expressão filter é a coluna calculada convertida para o tipo VARCHAR.
Correspondência de padrões de string
Use LIKE e NOT LIKE nas expressões de filtro para corresponder a padrões de string. A implementação usa a semântica find() de regex do Java, que difere do LIKE padrão do SQL de duas maneiras importantes:
• O padrão é uma expressão regular do Java. % e _ são tratados como literais de regex, e não como caracteres curinga.
• A correspondência usa a semântica de substring. O padrão precisa aparecer apenas em alguma posição na string para retornar TRUE; não é necessária a correspondência da string inteira.
Exemplo: Filtre registros cuja coluna code comece com HSRS.
O padrão a seguir gera uma correspondência incorreta — ABC_HSRS123 também é correspondido:
transform:
- source-table: db.orders
filter: code LIKE 'HSRS.*'
O padrão correto usa a âncora de início ^:
transform:
- source-table: db.orders
filter: code LIKE '^HSRS'
Os equivalentes para padrões comuns são os seguintes:
|
Sintaxe SQL |
Regex CDC equivalente |
Significado |
|
|
|
Começa com HSRS |
|
|
|
Termina com HSRS |
|
|
|
Contém HSRS |
|
|
|
Exatamente igual a HSRS |
Para a semântica completa do LIKE e mais equivalentes de regex, consulte Flink CDC built-in functions.
Regras de configuração avançada
Referenciar colunas não podadas e metadados
Exemplo 1: Filtrar com base em uma coluna podada
Suponha que o schema da tabela upstream seja [INT a, INT b, BOOLEAN c]. Para gerar as colunas a e b e manter apenas as linhas onde c é true, use a seguinte regra de configuração:
transform:
- source-table: ...
projection: a, b
filter: c
Exemplo 2: Filtrar com base em colunas de metadados
Use colunas de metadados diretamente como condições de filtro sem defini-las explicitamente no projection. Por exemplo, filtre dados de alteração do tipo DELETE.
transform:
- source-table: db.tbl
projection: a, b
filter: __data_event_type__ <> '-D'
Sobrescrever colunas existentes
No projection, defina um campo com o mesmo nome de uma coluna upstream para sobrescrever o valor ou o tipo dessa coluna. Esse método garante que o sistema sincronize a evolução do schema corretamente.
Exemplo: Forçar conversão de tipo
Suponha que o schema da tabela upstream seja [INT a, INT b, BOOLEAN c]. Para manter os nomes das colunas inalterados, mas forçar a conversão da coluna a para um tipo string, use a seguinte configuração:
transform:
- source-table: db.tbl
projection: \*, CAST(a AS VARCHAR) AS a
O schema da tabela downstream se torna [STRING a, INT b, BOOLEAN c]. A nova definição sobrescreve a coluna original a.
Reutilizar colunas calculadas em condições de filtro
Um filter pode referenciar diretamente o alias de uma coluna calculada definida em um projection.
Exemplo: Referenciar um resultado calculado
Defina uma nova coluna d no projection e use-a diretamente no filter.
transform:
- source-table: db.tbl
projection: a, b, c, a + b + c AS d
filter: d > 100
Essa configuração tem o mesmo efeito que a seguinte, mas é mais legível:
transform:
- source-table: ...
projection: a, b, c, a + b + c AS d
filter: a + b + c > 100
Conversor após o Transform
Use o converter-after-transform para processar alterações de dados após a aplicação de todas as regras do Transform. Especifique vários conversores separando-os por vírgulas (,). O sistema aplica os conversores na ordem em que são listados. Os seguintes valores de configuração são suportados:
|
Nome do conversor |
Recurso |
Versões suportadas |
|
SOFT_DELETE |
Converte alterações de exclusão em inserções. |
VVR 8.0.11 e posterior. |
|
FIELD_NAME_LOWER_CASE |
Converte todos os nomes de campo da tabela para minúsculas. |
VVR 11.1 e posterior. |
Soft delete
O conversor SOFT_DELETE funciona com a coluna de metadados __data_event_type__ para implementar exclusões lógicas. Isso significa que o sistema não exclui os dados fisicamente no downstream. Por exemplo, a seguinte configuração do Transform implementa uma exclusão lógica. O sistema converte uma operação de exclusão em uma inserção. Atualize o op_type dos dados correspondentes para -D para indicar a exclusão.
transform:
- source-table: db.tbl
projection: \*, __data_event_type__ AS op_type
converter-after-transform: SOFT_DELETE
O conversor SOFT_DELETE transforma apenas os dados nos quais __data_event_type__ é -D. Para também ignorar os dados nos quais __data_event_type__ é -U, adicione a configuração filter: op_type <> '-U'.
transform:
- source-table: db.tbl
projection: \*, __data_event_type__ AS op_type
filter: op_type <> '-U'
converter-after-transform: SOFT_DELETE