You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rapids 23.04中cudf/dask_cudf读取Parquet/ORC过滤条件失效

Rapids 23.04读取Parquet/ORC时行过滤不生效的解决办法

问题原因

Rapids的read_parquet/read_orc中filters参数的行过滤依赖文件分区信息或row group级统计信息实现谓词下推:只有当整个分区/row group完全不符合过滤条件时,才会被跳过。你的测试数据量极小,写入后仅生成一个row group,该group内a列的最小值为0、最大值为199,过滤条件a < 150无法排除整个row group,因此会读取全部数据;同时Rapids 23.04版本中,当无法通过谓词下推过滤时,filters不会自动在读取后应用行过滤,导致看起来完全不生效。

解决方案

方案1:写入时拆分row_group并启用统计信息

写入文件时指定row_group_size将数据拆分为多个row group,同时确保生成统计信息,这样不符合过滤条件的row group会被直接跳过,减少IO开销,适合大文件场景:

# 写入Parquet时指定row_group_size(比如每50行一个分组)
df.to_parquet('test.parquet', row_group_size=50, write_statistics=True)
# 读取时filters即可生效
filtered_df = cudf.read_parquet('test.parquet', columns=['a','c'], filters=[("a", "<", 150)])

# ORC文件同理
df.to_orc('test.orc', row_group_size=50)
filtered_df = cudf.read_orc('test.orc', columns=['a','c'], filters=[("a", "<", 150)])

dask_cudf读取时逻辑一致,谓词下推会自动生效,无需额外修改。

方案2:读取后手动过滤

如果不需要依赖谓词下推,直接在读取后通过布尔索引或query过滤行,这种方式不受文件结构限制,适合快速验证场景:

# cudf场景
df = cudf.read_parquet('test.parquet', columns=['a','c'])
filtered_df = df[df['a'] < 150]

# dask_cudf场景
ddf = dask_cudf.read_parquet('test.parquet', columns=['a','c'])
filtered_ddf = ddf[ddf['a'] < 150]
result = filtered_ddf.compute()

内容的提问来源于stack exchange,提问作者Quiescent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:52:53