Redshift Spectrum:按日期/文件夹自动分区表

时间:2017-11-08 16:16:01

标签: amazon-s3 amazon-redshift amazon-redshift-spectrum

我们目前会生成每日CSV导出,并将其上传到S3存储桶,并采用以下结构:

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

我们希望能够运行按每日导出分区的报告。

根据this页面,您可以通过一个密钥对Redshift Spectrum中的数据进行分区,该密钥基于Spectrum表格中的数据源S3文件夹。但是,从示例中,您似乎需要为每个分区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表格来添加当天的分区?

2 个答案:

答案 0 :(得分:6)

解决方案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/

答案 1 :(得分:0)

另一种精确的解决方法: 创建一个Lambda作业,该作业在S3存储桶的ObjectCreated通知上触发,并运行SQL添加分区:

更改表tblname如果不存在分区(分区子句),则添加s3:// mybucket / localtion