如何在未知Parquet schema时从S3加载数据到Redshift并添加默认时间列
Redshift 从S3 Parquet文件自动建表并新增默认时间列操作方案
自动通过Parquet文件schema创建目标表
Redshift 原生支持自动推断S3中Parquet文件的结构,无需提前手动定义字段,有两种常用实现方式:
- 方式1:使用COPY命令的
AUTO CREATE参数,执行时如果目标表不存在,会自动根据Parquet的schema创建表后直接导入数据,示例命令:
COPY your_target_table FROM 's3://你的存储桶路径/parquet文件目录/' IAM_ROLE 'arn:aws:iam::你的AWS账号ID:role/你的Redshift授权角色名' FORMAT PARQUET AUTO CREATE TRUE;
- 方式2:通过查询S3 Parquet文件直接建表,适合需要在建表阶段对字段做简单调整的场景:
CREATE TABLE IF NOT EXISTS your_target_table AS SELECT * FROM ( SELECT * FROM S3_OBJECT( 's3://你的存储桶路径/parquet文件目录/', 'aws_region=你的AWS区域' ) FORMAT PARQUET SCHEMA_AUTODETECT );
新增带默认值的时间列
注意你提供的列定义存在类型不匹配问题:to_char函数返回的是字符串类型,和timestamp列类型冲突,需要修正默认值逻辑,按你的需求只要取当前日期的零点时间戳即可,分两种场景实现:
- 场景1:还未创建目标表,可以在建表时直接新增默认列
CREATE TABLE IF NOT EXISTS your_target_table AS SELECT t.*, CURRENT_DATE::TIMESTAMP AS date FROM ( SELECT * FROM S3_OBJECT( 's3://你的存储桶路径/parquet文件目录/', 'aws_region=你的AWS区域' ) FORMAT PARQUET SCHEMA_AUTODETECT ) t; -- 给列添加默认值约束,后续新插入数据会自动填充 ALTER TABLE your_target_table ALTER COLUMN date SET DEFAULT CURRENT_DATE::TIMESTAMP;
- 场景2:已经通过自动建表生成了目标表,直接执行ALTER命令新增列即可
ALTER TABLE your_target_table ADD COLUMN date TIMESTAMP DEFAULT CURRENT_DATE::TIMESTAMP;
后续增量导入数据时,正常执行COPY命令即可,不需要为date字段传值,Redshift会自动填充默认值:
COPY your_target_table FROM 's3://你的存储桶路径/新增parquet文件目录/' IAM_ROLE 'arn:aws:iam::你的AWS账号ID:role/你的Redshift授权角色名' FORMAT PARQUET FILLRECORD;
内容的提问来源于stack exchange,提问作者gavisic
相关产品推荐
相关产品推荐

