PyArrow数据集过滤前如何转换列数据类型?
解决ParquetDataset过滤时的TypeError问题
问题原因
你混用了两种格式的过滤条件:三元组格式(如('group','==',group))和PyArrow表达式(如ds.field('value').cast('uint8') > 60)。在use_legacy_dataset=False模式下,ParquetDataset的filters参数不支持将PyArrow表达式作为列表元素传入——代码会尝试将表达式当作三元组处理,调用len()方法时触发错误。
修正方案
统一使用PyArrow表达式组合所有过滤条件,用&(逻辑与)连接多个条件,直接将组合后的表达式传给filters参数,而非列表。
修正后的代码
import pyarrow.dataset as ds # 组合所有过滤条件为单个PyArrow表达式 filter_expr = ( ds.field('group') == group & ds.field('table') == table & ds.field('value').cast('uint8') > 60 ) # 传入表达式到filters参数 df = ds.ParquetDataset( folder, use_legacy_dataset=False, filters=filter_expr ).read().to_pandas()
补充说明
如果需要兼容旧的三元组格式,也可以将每个三元组转换为PyArrow表达式后再组合,比如ds.field('group') == group等价于('group','==',group)的表达式形式,统一使用表达式能避免格式混用的问题。
内容的提问来源于stack exchange,提问作者jd conradie
相关产品推荐
相关产品推荐

