如何将CSV转为parquet-cpp 1.5.1-SNAPSHOT版本Parquet文件供Teradata读取
调整Parquet输出版本并适配Teradata的解决方案
一、设置Parquet输出版本适配parquet-cpp 1.5.1-SNAPSHOT
你之前的代码默认生成高版本Parquet格式,要兼容parquet-cpp 1.5.1-SNAPSHOT,只需在写入时指定对应参数即可:
- 核心参数
version='1.0':Parquet格式V1版本完全兼容parquet-cpp 1.5.x系列,对应你需要的1.5.1-SNAPSHOT版本 - 配套参数
coerce_timestamps='ms':将pandas默认的纳秒精度时间戳转为毫秒精度,避免老版本Parquet解析报错 - 若需要元数据中完全显示
parquet-cpp version 1.5.1-SNAPSHOT标识,可手动覆盖写入元数据的created_by字段
二、适配Teradata的Parquet生成规则
根据你提到的Teradata限制,生成兼容文件需遵守以下规则:
- 所有字段仅使用基础标量类型(整数、浮点数、字符串、时间戳),禁止生成STRUCT、MAP、LIST、ENUM等复杂类型,不要有嵌套结构
- 尽量关闭高级编码特性:如果出现读取异常,可禁用字典编码
use_dictionary=False - 选择兼容的压缩格式:建议使用
snappy或不压缩,避免使用zstd、lz4等新压缩算法
三、完整可运行代码
import pandas as pd import pyarrow.parquet as pq import pyarrow as pa # 读取CSV文件 df = pd.read_csv('27.csv') # 处理datetime字段类型,避免生成非标准类型 df['datetime'] = pd.to_datetime(df['datetime']) # 转换为pyarrow Table,方便精细控制写入参数 table = pa.Table.from_pandas(df, preserve_index=False) # 自定义元数据,匹配要求的版本标识 custom_metadata = {b'created_by': b'parquet-cpp version 1.5.1-SNAPSHOT'} # 写入兼容文件 pq.write_table( table, '27_teradata_compatible.parquet', version='1.0', # 指定Parquet格式版本,兼容1.5.x系列 coerce_timestamps='ms', # 时间戳转毫秒精度,适配老版本 compression='snappy', # 兼容度最高的压缩格式,也可填'none'不压缩 use_dictionary=False, # 禁用字典编码,解决部分Teradata读取异常 write_statistics=False, # 关闭统计信息,减少兼容性问题 metadata=custom_metadata # 写入自定义版本标识 ) # 验证写入结果 metadata = pq.read_metadata('27_teradata_compatible.parquet') print(metadata) da = pd.read_parquet('27_teradata_compatible.parquet') print(da.head(10))
内容的提问来源于stack exchange,提问作者2015evanotes
相关产品推荐
相关产品推荐

