web-dev-qa-db-fra.com

Comment convertir de nombreux fichiers CSV en parquet à l'aide d'AWS Glue

J'utilise AWS S3, Glue et Athena avec la configuration suivante:

S3 -> Colle -> Athena

Mes données brutes sont stockées sur S3 sous forme de fichiers CSV. J'utilise Glue pour ETL et j'utilise Athena pour interroger les données.

Puisque j'utilise Athena, j'aimerais convertir les fichiers CSV en Parquet. J'utilise AWS Glue pour le faire en ce moment. Voici le processus que j'utilise actuellement:

  1. Exécutez Crawler pour lire les fichiers CSV et remplir le catalogue de données.
  2. Exécutez le travail ETL pour créer un fichier Parquet à partir du catalogue de données.
  3. Exécutez un robot pour remplir le catalogue de données à l'aide du fichier Parquet.

Le travail de collage ne me permet de convertir qu'une table à la fois. Si j'ai de nombreux fichiers CSV, ce processus devient rapidement ingérable. Existe-t-il une meilleure façon, peut-être une méthode "correcte", de convertir plusieurs fichiers CSV en Parquet en utilisant AWS Glue ou un autre service AWS?

7
mark s.

J'ai eu exactement la même situation où je voulais parcourir efficacement les tables de catalogue cataloguées par le robot qui pointent vers des fichiers csv, puis les convertir en parquet. Malheureusement, il n'y a pas encore beaucoup d'informations disponibles sur le Web. C'est pourquoi j'ai écrit un blog en LinkedIn expliquant comment je l'ai fait. Veuillez lire; spécialement le point # 5. J'espère que cela pourra aider. Veuillez me faire part de vos commentaires.

Remarque: selon les commentaires d'Antti, je colle la solution d'extrait de mon blog ci-dessous:

  1. Itération dans le catalogue/la base de données/les tables

Le Job Wizard est livré avec une option pour exécuter un script prédéfini sur une source de données. Le problème est que la source de données que vous pouvez sélectionner est une seule table du catalogue. Elle ne vous donne pas la possibilité d'exécuter le sur toute la base de données ou sur un ensemble de tables. Vous pouvez de toute façon modifier le script plus tard, mais la manière de parcourir les tables de base de données dans le catalogue de colle est également très difficile à trouver. Il existe des API de catalogue mais il manque des exemples appropriés. peut être enrichi de beaucoup plus de scénarios pour aider les développeurs.

Après un peu de déblayage, j'ai trouvé le script ci-dessous qui fait le travail. J'ai utilisé le client boto3 pour parcourir la table. Je le colle ici s'il s'agit de l'aide de quelqu'un. J'aimerais aussi avoir de vos nouvelles si vous avez une meilleure suggestion

import sys
import boto3
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)


client = boto3.client('glue', region_name='ap-southeast-2')

databaseName = 'tpc-ds-csv'
print '\ndatabaseName: ' + databaseName

Tables = client.get_tables(DatabaseName=databaseName)

tableList = Tables['TableList']

for table in tableList:
    tableName = table['Name']
    print '\n-- tableName: ' + tableName

    datasource0 = glueContext.create_dynamic_frame.from_catalog(
        database="tpc-ds-csv", 
        table_name=tableName, 
        transformation_ctx="datasource0"
    )

    datasink4 = glueContext.write_dynamic_frame.from_options(
        frame=datasource0,
        connection_type="s3", 
        connection_options={
            "path": "s3://aws-glue-tpcds-parquet/"+ tableName + "/"
            },
        format="parquet",
        transformation_ctx="datasink4"
    )
job.commit()
7
Tanveer Uddin

Veuillez consulter EDIT pour des informations mises à jour.

S3 -> Athéna

Pourquoi ne pas utiliser le format CSV directement avec Athena?

https://docs.aws.Amazon.com/athena/latest/ug/supported-format.html

CSV est l'un des formats pris en charge. De plus, pour le rendre efficace, vous pouvez compresser plusieurs fichiers CSV pour un chargement plus rapide.

Compression prise en charge,

https://docs.aws.Amazon.com/athena/latest/ug/compression-formats.html

J'espère que cela aide.

MODIFIER:

Pourquoi le format Parquet est plus utile que CSV?

https://dzone.com/articles/how-to-be-a-hero-with-powerful-parquet-google-and

S3 -> Colle -> Athena

Plus de détails sur la conversion de CSV en parquet,

https://aws.Amazon.com/blogs/big-data/build-a-data-lake-foundation-with-aws-glue-and-Amazon-s3/

2
Kannaiyan

On dirait que dans votre étape 1, vous explorez le fichier csv individuel (par exemple, un-compartiment/chemin-conteneur/fichier.csv), mais si vous définissez plutôt votre robot pour qu'il regarde un niveau de chemin plutôt qu'un niveau de fichier (par exemple, bucket/container-path /) et tous vos fichiers csv sont uniformes, le robot ne doit créer qu'une seule table externe au lieu d'une table externe par fichier et vous pourrez extraire les données de tous les fichiers à la fois.

0
kinzleb