Redshift Spectrum:按 date/folder 自动对表进行分区

Redshift Spectrum: Automatically partition tables by date/folder

我们目前每天生成一个 CSV 导出文件,并将其上传到 S3 存储桶,并导出为以下结构:

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

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

根据 this 页面,您可以通过一个键对 Redshift Spectrum 中的数据进行分区,该键基于您的 Spectrum table 来源其数据的源 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/';

有什么方法可以设置 table 以便数据自动按其来源的文件夹进行分区,或者我们是否需要每天 ALTER table添加当天的分区?

解决方案一:

每个 table 最多可以创建 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/';

方案二:

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

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

alter table tblname ADD IF NOT EXISTS PARTITION(分区子句)localtion s3://mybucket/localtion