web-dev-qa-db-ja.com

Redshift Spectrum:日付/フォルダーでテーブルを自動的に分割します

現在、S3バケットにアップロードするCSVエクスポートを毎日生成して次の構造にしています。

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

毎日のエクスポートによって分割されたレポートを実行できるようにしたいと考えています。

this ページによると、SpectrumテーブルがデータをソースするソースS3フォルダーに基づくキーによってRedshiftSpectrumのデータを分割できます。ただし、この例から、パーティションごとにALTERステートメントが必要であるように見えます。

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/';

データが元のフォルダーによって自動的にパーティション化されるようにテーブルを設定する方法はありますか、それともその日のパーティションを追加するためにテーブルをALTERする毎日のジョブが必要ですか?

7

解決策1:

テーブルごとに最大20000のパーティションを作成できます。ワンタイムスクリプトを作成して、将来のすべてのs3パーティションフォルダーのパーティション(最大20k)を追加できます。

例えば。

フォルダーs3:// bucket/ticket/spectrum/sales_partition/saledate = 2017-12 /が存在しない場合は、そのためのパーティションを追加することもできます。

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

解決策2:

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

8
Sumit Saurabh

もう1つの正確な方法は、S3バケットからのObjectCreated通知でトリガーされるLambdaジョブを作成し、SQLを実行してパーティションを追加することです。

alter table tblname ADD IF NOT EXISTS PARTITION(パーティション句)localtion s3:// mybucket/localtion

0
Vinayak Thatte