Convertendo datas com PyArrow
Precisava carregar no
PostgreSQL
seis arquivos "csv", cada um com aproximadamente 11 milhões de registros.
Ao abrir um dos arquivos, me deparei com quatro colunas de data no
formato: "dd/mm/aaaa".
Poderia converter com
PostgreSQL,
Pandas,
DuckDB ...
mas como seria usando o
PyArrow?
Como é uma "string" de data, logo me veio em mente
strptime e
strftime,
ambos da biblioteca
datetime.
Procurei na
documentação
algo com o mesmo nome e encontrei em
pyarrow.compute,
que é um módulo com operações e funções que podem ser
usadas para
agregação,
seleção,
comparação,
conversão,
etc.
Para esse post criei alguns dados...
E o código fica assim:
Começo definindo uma função interna ("setDateFormat") que fará a conversão.
Receberá como argumento um
pyarrow.ChunkedArray
gerado por
pyarrow.Table.itercolumns,
no loop. Faz o parse da "string", a formata e converte o tipo para
pyarrow.date32,
já que não precisava ter nas datas: "horas", "minutos" e "segundos".
Caso fosse necessário, usaria
pyarrow.date64.
Ao ler o arquivo "csv" passo dois argumentos: o nome dos campos presentes no arquivo
(...com possibilidade de já renomear!), e um mapeamento explícito do campo e
seu tipo, que inicialmente é "string" para todos. Obtenho uma
pyarrow.Table,
e dela seleciono as colunas que serão convertidas.
O loop me dá também o nome de cada coluna para utilizar em
pyarrow.Table.drop_columns e
pyarrow.Table.append_column.
Exclui a antiga e adiciona uma com novo formato, respectivamente.
Como alternativa poderia ter usado o
pyarrow.Table.set_column.
Por fim, carrego os dados no banco utilizando o
ADBC.
Sem sobrecarga de memória e o desempenho é notável!
E você, o que achou? Como faria?
Obrigado pela leitura.