如何解决AWS Redshift Spectrum读取Clickhouse生成的Parquet文件的压缩错误?
问题分析与解决
核心问题:ClickHouse生成的Parquet使用了Redshift Spectrum不支持的压缩算法
错误提示里的compression: 7对应Parquet规范中的LZ4_RAW压缩编码,而Redshift Spectrum目前不支持这种压缩格式,仅兼容标准LZ4(编码10)、Snappy、Gzip、Zstd等常见压缩算法。
ClickHouse默认导出Parquet时采用的就是LZ4_RAW压缩,这是所有列都触发相同错误的根本原因,和字段类型(binary/uint32)无关。
解决步骤
1. 修改ClickHouse导出Parquet的压缩算法
在导出数据时,通过SETTINGS参数指定Redshift支持的压缩方式,比如Snappy或标准LZ4:
示例导出SQL:
SELECT team_id, project_id, user_id INTO OUTFILE 's3://my_bucket/my_parquet.pqt' FORMAT Parquet SETTINGS parquet_compression_method='snappy'; -- 也可替换为 'lz4'(标准LZ4,非RAW版本)
说明:ClickHouse的
parquet_compression_method可选值包括gzip、snappy、lz4、zstd,这些都是Redshift Spectrum兼容的类型。
2. 调整Redshift外部表字段映射(确保类型匹配)
压缩问题解决后,确认字段类型对应关系:
- ClickHouse的
String类型导出为Parquet的binary,对应Redshift的VARBYTE或VARCHAR均可(如果是字符串内容,用VARCHAR更直观) - ClickHouse的
UInt32对应Redshift的INT或BIGINT(BIGINT可避免溢出风险)
修正后的外部表创建语句:
CREATE EXTERNAL TABLE spectrum.my_test_table ( team_id VARCHAR(64), -- 或 VARBYTE(64),根据实际数据内容选择 project_id INT, -- 或 BIGINT user_id VARCHAR(64) ) STORED AS PARQUET LOCATION 's3://my_bucket/';
验证方法
导出新的Parquet文件后,可通过PyArrow确认压缩格式是否正确:
import pyarrow.parquet as pq parquet_file = pq.ParquetFile('test.pqt') for row_group_idx in range(parquet_file.num_row_groups): col_meta = parquet_file.metadata.row_groups[row_group_idx].columns[0] print(f"列 {parquet_file.schema.names[0]} 压缩算法: {col_meta.compression}")
输出应为SNAPPY或LZ4(而非LZ4_RAW),此时Redshift Spectrum即可正常读取文件。
内容的提问来源于stack exchange,提问作者Rinze
相关产品推荐
相关产品推荐

