You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:10:58