PyArrow写入Parquet的timestamp[s]重载后变timestamp[ms]的问题咨询
问题解答
是不是Parquet格式不支持秒级时间戳?
不是。Parquet规范明确定义了四种时间戳精度类型:TIMESTAMP_SECONDS(秒级)、TIMESTAMP_MILLIS(毫秒级)、TIMESTAMP_MICROS(微秒级)、TIMESTAMP_NANOS(纳秒级),完全支持秒级时间戳存储。问题出在PyArrow的默认写入行为——默认会将时间戳强制转换为毫秒精度,这是出于兼容早期Parquet实现的考量,并非格式本身的限制。
如何让重载后的schema与原schema完全一致?
在调用pq.write_metadata时,指定coerce_timestamps=None参数,即可保留时间戳的原始精度:
import pyarrow as pa, pyarrow.parquet as pq # 定义原schema schema = pa.schema([pa.field("dob", pa.timestamp('s'))]) print("原schema:", schema) # 写入元数据时保留原始时间戳精度 pq.write_metadata(schema, '_common_schema', coerce_timestamps=None) # 重新读取元数据 reloaded_schema = pq.read_schema('_common_schema') print("重载后的schema:", reloaded_schema)
执行上述代码后,重载后的schema会和原schema一致,均为dob: timestamp[s]。
如果是写入实际Parquet数据文件,同样可以在pq.write_table中传递coerce_timestamps=None参数,确保时间戳精度不被修改。
内容的提问来源于stack exchange,提问作者zaidwaqi
相关产品推荐
相关产品推荐

