現在、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
する毎日のジョブが必要ですか?
解決策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:
もう1つの正確な方法は、S3バケットからのObjectCreated通知でトリガーされるLambdaジョブを作成し、SQLを実行してパーティションを追加することです。
alter table tblname ADD IF NOT EXISTS PARTITION(パーティション句)localtion s3:// mybucket/localtion