AWS Redshift Spectrum读取Apache Parquet文件报错求助
问题原因排查与解决方法
问题原因
错误核心是数据类型不匹配:
- Pandas读取CSV时,默认会把整数列识别为
int64(64位整数)类型,导出Parquet文件时会保留该类型。 - 你在Redshift Spectrum中定义的
id列类型为integer,而Redshift的integer对应32位整数(int32),和Parquet文件里的int64类型不兼容,因此触发Spectrum扫描错误。
解决方法
提供两种可行方案:
方案1:调整Parquet导出时的数据类型
在Pandas导出前,将id列强制转换为32位整数,修改后的代码如下:
import pandas as pd df = pd.read_csv('./data/students.csv') # 将id列转为int32类型,匹配Redshift的integer类型 df['id'] = df['id'].astype('int32') df.to_parquet('students.parquet')
重新生成Parquet文件并上传至S3后,执行查询即可正常运行。
方案2:修改Redshift外部表的列类型
将表定义中的id列类型改为bigint(Redshift的bigint对应64位整数,与Parquet的int64类型匹配),调整后的建表语句:
create external table imp.s1 ( id bigint, name varchar(255), gender varchar(255) ) stored as PARQUET location 's3://sample/students/';
注:若原表已存在,需先删除原表再重新创建,或通过alter table语句调整列类型(部分场景下需重建表)。
内容的提问来源于stack exchange,提问作者WAEX
相关产品推荐
相关产品推荐

