web-dev-qa-db-fra.com

Redshift Spectrum: partitionne automatiquement les tables par date/dossier

Nous générons actuellement une exportation au format CSV quotidienne que nous téléchargeons dans un compartiment S3, dans la structure suivante:

<report-name>
|--reportDate-<date-stamp>
    |-- part0.csv.gz
    |-- part1.csv.gz

Nous voulons pouvoir exécuter des rapports partitionnés par exportation quotidienne.

Selon this page, vous pouvez partitionner les données dans Redshift Spectrum avec une clé basée sur le dossier S3 source dans lequel votre table Spectrum fournit ses données. Toutefois, à partir de l'exemple, il semble que vous ayez besoin d'une instruction ALTER pour chaque partition:

alter table spectrum.sales_part
add partition(saledate='2008-01-01') 
location 's3://bucket/tickit/spectrum/sales_partition/saledate=2008-01/';

alter table spectrum.sales_part
add partition(saledate='2008-02-01') 
location 's3://awssampledbuswest2/tickit/spectrum/sales_partition/saledate=2008-02/';

Existe-t-il un moyen de configurer la table de sorte que les données soient automatiquement partitionnées par le dossier d'où elles proviennent, ou avons-nous besoin d'un travail quotidien pour ALTER la table pour ajouter la partition de ce jour?

6
GoatInTheMachine

Solution 1:

Au maximum 20000 partitions peuvent être créées par table. Vous pouvez créer un script unique pour ajouter les partitions (20 000 max.) À tous les futurs dossiers de partitions s3.

Pour par exemple.

Si le dossier s3: // bucket/ticket/spectrum/sales_partition/saledate = 2017-12/n'existe pas, vous pouvez même ajouter une partition pour cela.

alter table spectrum.sales_part
add partition(saledate='2017-12-01') 
location 's3://bucket/tickit/spectrum/sales_partition/saledate=2017-12/';

Solution 2:

https://aws.Amazon.com/blogs/big-data/data-lake-ingestion-automatically-partition-Hive-external-tables-with-aws/

6
Sumit Saurabh

Une autre façon précise de procéder: Créez un travail Lambda déclenché sur la notification ObjectCreated du compartiment S3 et exécutez le code SQL pour ajouter la partition: 

alter table tblname ADD IF PAS EXISTS PARTITION (clause de partition) localtion s3: // mybucket/localtion

0
Vinayak Thatte