J'ai un travail par lots d'allumage qui est exécuté toutes les heures. Chaque exécution génère et stocke de nouvelles données dans S3
avec le modèle de nommage de répertoire DATA/YEAR=?/MONTH=?/DATE=?/datafile
.
Après avoir téléchargé les données dans S3
, je souhaite les analyser à l'aide de Athena
. De plus, j'aimerais les visualiser dans QuickSight
en me connectant à Athena en tant que source de données.
Le problème est que, après chaque exécution de mon lot Spark, les données nouvellement générées stockées dans S3
ne seront pas découvertes par Athena, sauf si je lance manuellement la requête MSCK REPARI TABLE
.
Existe-t-il un moyen d'obliger Athena à mettre à jour les données automatiquement, afin que je puisse créer un pipeline entièrement automatique de visualisation des données?
Il existe plusieurs façons de planifier cette tâche. Comment planifiez-vous vos flux de travail? Utilisez-vous un système tel que Airflow , Luigi , Azkaban , cron ou utilisez un AWS Data pipeline ?
À partir de ces éléments, vous devriez pouvoir lancer la commande CLI suivante.
$ aws athena start-query-execution --query-string "MSCK REPAIR TABLE some_database.some_table" --result-configuration "OutputLocation=s3://SOMEPLACE"
Une autre option serait AWS Lambda . Vous pourriez avoir une fonction qui appelle MSCK REPAIR TABLE some_database.some_table
en réponse à un nouveau téléchargement sur S3.
Un exemple de fonction Lambda pourrait être écrit en tant que tel:
import boto3
def lambda_handler(event, context):
bucket_name = 'some_bucket'
client = boto3.client('athena')
config = {
'OutputLocation': 's3://' + bucket_name + '/',
'EncryptionConfiguration': {'EncryptionOption': 'SSE_S3'}
}
# Query Execution Parameters
sql = 'MSCK REPAIR TABLE some_database.some_table'
context = {'Database': 'some_database'}
client.start_query_execution(QueryString = sql,
QueryExecutionContext = context,
ResultConfiguration = config)
Vous devez ensuite configurer un déclencheur pour exécuter votre fonction Lambda lorsque de nouvelles données sont ajoutées sous le préfixe DATA/
dans votre compartiment.
En fin de compte, la reconstruction explicite des partitions après l'exécution de votre tâche Spark à l'aide d'un planificateur de tâches présente l'avantage d'être auto-documentée. Par ailleurs, AWS Lambda est pratique pour des tâches telles que celle-ci.
Vous devriez exécuter ADD PARTITION
à la place:
aws athena start-query-execution --query-string "ALTER TABLE ADD PARTITION..."
Ce qui ajoute une partition récemment créée à partir de votre emplacement S3
Athena utilise Hive pour partitionner les données . Pour créer une table avec des partitions, vous devez la définir lors de l’instruction CREATE TABLE
. Utilisez PARTITIONED BY
pour définir les clés permettant de partitionner les données.