Pular para o conteúdo

Conector Oracle CDC Kafka: Solução para replicação de campos do tipo Date com Time Portion

Conector Oracle CDC Kafka – Time Portion no campo Date

Olá pessoal !

Se vocês acompanharam a série Replicando dados com Kafka e Oracle CDC e encontraram um problema com a replicação de campos do tipo Date, esse é o artigo certo para você !

O conector Oracle CDC Premium da Confluent, tem uma pequena particularidade. Os campos Date são replicados sem o time portion, portanto, mesmo que a informação seja um date time, apenas o date portion será replicado. Tenho certeza de que para muitos, isso possa ser um impeditivo para utilizar a replicação usando esse conector. No meu caso, com certeza era e precisei encontrar uma maneira para contornar esse problema.

Primeiramente, fui consultar o que a documentação dizia sobre o caso:

image 12

Com essa informação, tentei utilizar algumas abordagens. A primeira tentativa foi utilizando o SMT (Simple Message Transforms).

O SMT permite fazer pequenas transformações de dados diretamente pelo conector. Ele funciona da seguinte maneira:

image 13

Utilizando o SMT, inclui o seguinte código no meu arquivo de configuração do conector para fazer um teste:

"transforms": "TimestampConverter",
"transforms.TimestampConverter.type": "org.apache.kafka.connect.transforms.TimestampConverter$Value",
"transforms.TimestampConverter.format": "dd-MM-yyyy HH:mm:ss",
"transforms.TimestampConverter.field": "TESTE_DATE",
"transforms.TimestampConverter.target.type": "string"

As instruções acima deveriam converter o campo TESTE_DATE para string com as informações formatadas como dd-MM-yyyy HH:mm:ss.

Ao executar o conector, recebi o seguinte resultado quando consultei o campo:

20-05-2023 00:00:00

Resumindo, não funcionou !

Ao analisar mais profundamente o caso, percebi que as informações time portion já não existiam na captura do próprio redolog. Era possível constatar isso ao verificar o tópico do redolog. Após essa constatação, ficou claro que o SMT realmente não seria uma solução.

Ao consultar um parceiro que nos apoia em uma POC Kafka na empresa, eis que a resposta foi encontrada em uma propriedade do próprio conector. O oracle.date.mapping !

Vamos dar uma olhada na documentação:

image 14

Essa propriedade permite alterar o tipo que será utilizado para os campos do tipo Date no conector. O default é date, mas iremos alterar para timestamp.

Para isso, inclua no seu arquivo de configuração do conector Oracle CDC:

"oracle.date.mapping": "timestamp"

Após recriar o conector, fiz uma nova consulta no campo e o resultado foi:

20-05-2023 09:04:38

Pronto ! O time portion já está disponível na base de dados destino !

Apesar de ter chegado ao resultado que eu queria, existe um porém ! Na tabela replicada, os campos que são do tipo DATE em sua origem serão convertidos para TIMESTAMP no destino ! No meu caso, isso não é um problema, mas fica o aviso para que analisem se isso será algo a se preocupar ao aplicar essa solução.

Espero ter ajudado ! 🙂

Referências

Sergio Willians

Sergio Willians

Sergio Willians é o fundador do GPO (Grupo de Profissionais Oracle) e possui quase 30 anos de experiência em tecnologias Oracle, sendo especialista em desenvolvimento Forms/Reports, PL/SQL e EBS (E-Business Suite) nos módulos Receivables, Payables e General Ledger. Atualmente trabalha na Scania Latin America, onde se dedica à área de integração de dados com Confluent Kafka. Sua paixão é compartilhar conhecimento com a comunidade Oracle, contribuindo para o crescimento e a excelência da plataforma.

Comentário(s) da Comunidade

  1. Sergio parabéns pelo novo artigo.
    Pelo que entendi não ha maneira de ter a informação completa de hora utilizando o campo date? Seria isso? Eu sou obrigado a usar timestamp então.

    1. Como vai Geno ?

      Infelizmente sim. Essa solução sobre a qual escrevi, também foi indicada por um dos engenheiros da confluent.
      Pelo menos no meu caso, trabalhar com timestamp ao invés de date, não tem sido um problema incontornável. Você enxergou ou está vivenciando uma situação onde obrigatoriamente deveria ser Date ?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress