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:
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?
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:
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()
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/
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.