- Data Engineer technical test
- Todas as operações devem ser realizadas utilizando Spark
- A entrega deve ser desenvolvida em Python
-
Conversão do formato dos arquivos: Converter o arquivo CSV presente no diretório data/input/users/load.csv, para um formato colunar de alta performance de leitura de sua escolha. Justificar brevemente a escolha do formato
-
Deduplicação dos dados convertidos: No conjunto de dados convertidos haverão múltiplas entradas para um mesmo registro, variando apenas os valores de alguns dos campos entre elas. Será necessário realizar um processo de deduplicação destes dados, a fim de apenas manter a última entrada de cada registro, usando como referência o id para identificação dos registros duplicados e a data de atualização (update_date) para definição do registro mais recente
-
Conversão do tipo dos dados deduplicados: No diretório config haverá um arquivo JSON de configuração (types_mapping.json), contendo os nomes dos campos e os respectivos tipos desejados de output. Utilizando esse arquivo como input, realizar um processo de conversão dos tipos dos campos descritos, no conjunto de dados deduplicados;
-
Todas as operações devem ser realizadas utilizando Spark
- O serviço de execução fica a seu critério, podendo utilizar tanto serviços locais como serviços em cloud
- Justificar brevemente o serviço escolhido (EMR, Glue, Zeppelin, etc.).
-
Cada operação deve ser realizada no dataframe resultante do passo anterior
- Pode ser persistido e carregado em diferentes conjuntos de arquivos após cada etapa
- Ou executados em memória e apenas persistido após operação final
-
Você tem liberdade p/ seguir a sequência de execução desejada
-
Solicitamos a transformação de tipos de dados apenas de alguns campos. Os outros ficam a seu critério
-
O arquivo ou o conjunto de arquivos finais devem ser compactados e enviados por e-mail
Ambos os formatos (ORC, Parquet) são altamente utilizados e conhecidos.
As soluções Glue para ETL e Apache Flink como mecanismo de streaming de dados ORC e Parquet, suportam ambos os formatos de arquivo.
Já as soluções Apache Hive (preferido para Batch processing) e Apache Impala (preferido para ad hoc queries) suportam ambos os formatos, porém o formato recomendado é Orc para o Hive e o Parquet para o Impala.
No nosso caso de referencia que é somente o processamento do arquivo CSV para Colunar utilizando Spark, o mesmo também suporta ambas as opções ORC, Parquet
Ambos os formatos seriam boas escolhas visando suporte das plataformas e soluções. Ambos também tem uma boa performance considerando o "Benchmarking PARQUET vs ORC" realizado por Dhareshwarganesh. Porém o formato Parquet tem um melhor suporte ao Spark diretamente conforme apresentado pelo Xinran Waibel no towardsdatascience.
Para uma escolha mais assertiva de um formato do arquivo é necessário tem uma visão mais ampla de como será
Foi criado o diretório local_execution com intuito de iniciar no projeto e validar algumas operações antes de rodar na Cloud.
Dentro deste diretório existe um README.md explicando com executar o mesmo.
A solução local não está completamente implementada, mas achei valido permanecer com este componente no projeto para consultas de futura melhoria.
A plataforma que foi escolhida pela sua simplicidade de operação, visto que o problema apresentado é simples.
Também considerei o custo para execução na cloud, para este projeto foi gasto $0,26 para o Glue e para o S3 eu permaneci dentro do free tier.
O projeto aws-glue-csv-parquet
O projeto aws-glue-csv-parquet é a minha solução para este problema. Foi escolhido ser feito em um repositório separado para simplificar o pipeline.
A estrutura, definição e a descrição da solução deste projeto é feita no submodulo do mesmo.
git submodule add [email protected]:afonsoaugusto/aws-glue-csv-parquet.git
git submodule update --init --recursive