PyArrow按日期时间列筛选Parquet子集报类型不匹配错误
问题场景
使用pyarrow库的read_table方法读取Parquet文件、按时间字段筛选数据子集,初始实现代码如下:
import pyarrow.parquet as pq s3_uri = "Path to s3" fp = pq.read_table( source = s3_uri, use_threads = True, filters = [('Date_Time' ,'>=','2022-07-08'),('Date_Time' ,'<', '2022-07-09')] ) print(fp.to_pandas())
执行代码时抛出如下错误:
pyarrow.lib.ArrowNotImplementedError: Function greater_equal has no kernel matching input types (array[timestamp[us]], scalar[string])
故障原因
筛选条件中传入的日期比较值为字符串类型,与Date_Time列存储的微秒级时间戳类型(timestamp[us])不匹配,对应比较函数没有适配这组输入类型的处理内核,无法执行比较逻辑。
修复方案
将筛选条件中的字符串日期值,转换为和目标列类型匹配的时间戳标量即可,修正后代码如下:
import pyarrow as pa import pyarrow.parquet as pq s3_uri = "Path to s3" # 按列的实际时间精度转换筛选值,这里对应原报错的微秒级精度 start_time = pa.scalar("2022-07-08", type=pa.timestamp("us")) end_time = pa.scalar("2022-07-09", type=pa.timestamp("us")) fp = pq.read_table( source = s3_uri, use_threads = True, filters = [('Date_Time' ,'>=', start_time),('Date_Time' ,'<', end_time)] ) print(fp.to_pandas())
注意:如果Date_Time列的时间精度不是微秒(比如为毫秒ms、纳秒ns),需要把pa.timestamp()的入参替换为对应精度单位,避免隐式类型转换带来的筛选异常。
内容的提问来源于stack exchange,提问作者GeekGroot
相关产品推荐
相关产品推荐

