如何将Amazon Redshift数据以Parquet格式导出至Amazon S3并通过Redshift Spectrum查询
别担心,Redshift完全支持直接将数据导出为Parquet格式到S3,而且之后用Spectrum查询也很顺畅——可能你之前查的资料比较旧或者没找对地方,我给你分享下实际操作的步骤和注意点:
一、用UNLOAD命令导出Parquet到S3
这是Redshift导出数据到S3的核心命令,现在已经支持指定Parquet格式了,示例代码如下:
UNLOAD ('SELECT column1, column2, column3 FROM your_source_table WHERE date >= ''2024-01-01''') TO 's3://your-s3-bucket/redshift-exports/parquet-data/' IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Unload-S3-Access-Role' FORMAT PARQUET PARTITION BY (date, region) -- 可选:按字段分区,优化Spectrum查询性能 COMPRESSION SNAPPY; -- 可选:压缩格式,SNAPPY是Parquet默认值,平衡速度和压缩率
逐行解释下关键参数:
- 括号里的
SELECT语句:可以是任意合法的Redshift查询,既可以导出整张表,也可以过滤、聚合后导出 TO:指定S3的目标路径,注意末尾要加斜杠,Redshift会自动生成多个Parquet文件(因为集群是分布式的,每个节点会导出自己分片的数据)IAM_ROLE:必须是Redshift集群有权限Assume的IAM角色,这个角色需要具备s3:PutObject权限,能写入目标S3桶FORMAT PARQUET:这就是指定导出格式为Parquet的关键参数,也是你之前可能没注意到的点PARTITION BY:可选参数,按指定字段分区后,S3上会生成类似date=2024-01-01/region=us-east-1的目录结构,Spectrum查询时可以跳过无关分区,大幅提升速度COMPRESSION:可选,支持SNAPPY、GZIP、NONE等,推荐用SNAPPY
二、创建Redshift Spectrum外部表查询S3上的Parquet数据
导出完成后,就可以通过Spectrum查询这些Parquet文件了,步骤如下:
- 先创建关联到Glue Data Catalog的外部Schema(如果没有Glue,也可以用Hive metastore,不过Glue更常用):
CREATE EXTERNAL SCHEMA spectrum_parquet_schema FROM DATA CATALOG DATABASE 'your-glue-database-name' IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Spectrum-Access-Role' CREATE EXTERNAL DATABASE IF NOT EXISTS;
- 创建外部表指向S3上的Parquet文件:
CREATE EXTERNAL TABLE spectrum_parquet_schema.your_external_table ( column1 INT, column2 VARCHAR(100), column3 TIMESTAMP ) STORED AS PARQUET LOCATION 's3://your-s3-bucket/redshift-exports/parquet-data/' PARTITIONED BY (date DATE, region VARCHAR(20)); -- 如果UNLOAD时用了PARTITION BY,这里必须对应
- 如果是分区表,需要加载S3上的分区信息:
ALTER TABLE spectrum_parquet_schema.your_external_table RECOVER PARTITIONS;
之后你就可以像查询普通Redshift表一样查询这个外部表了:
SELECT * FROM spectrum_parquet_schema.your_external_table WHERE date = '2024-01-01';
三、关键注意事项
- 集群版本要求:Redshift 1.0.1000及以上版本才支持Parquet格式的UNLOAD,如果你的集群版本太老,建议升级到最新稳定版
- 字段类型兼容性:大部分Redshift数据类型都能直接导出为Parquet兼容类型,比如
INT、VARCHAR、TIMESTAMP、FLOAT等;少数特殊类型(比如GEOMETRY)需要先转换为字符串再导出 - 权限配置:确保IAM角色的权限足够:Redshift集群要能Assume该角色,角色要有S3的读写权限(UNLOAD需要写,Spectrum需要读),还要有Glue Data Catalog的相关权限(如果用Glue的话)
- 文件大小控制:UNLOAD默认会生成最大6.2GB的Parquet文件,你可以用
MAXFILESIZE参数调整,比如MAXFILESIZE 10 GB
内容的提问来源于stack exchange,提问作者Teja
相关产品推荐
相关产品推荐

