关于ParquetFileReader.getFilteredRecordCount()方法的计数异常问题
关于ParquetFileReader.getFilteredRecordCount()不生效的问题
问题根源
你遇到的问题核心是对这个方法的工作机制理解有误:
getFilteredRecordCount()是基于Parquet文件元数据的统计信息(列/页级的min、max、null计数等)做快速估算,不会实际读取或过滤任何记录。- 你通过
ParquetReadOptions.withRecordFilter()设置的过滤器,是给**实际读取记录(比如read()方法)**时用的,和这个计数方法完全无关。 - 如果过滤条件无法通过元数据统计快速判断(比如列没有统计值、条件是复杂模糊匹配等),该方法会直接返回文件总记录数。
解决方案
1. 获取精确的过滤后记录数
如果需要准确计数,必须实际读取并过滤记录:
try (var reader = new ParquetFileReader(new FileSystemInputFile(file), ParquetReadOptions.builder().withRecordFilter(filter).build())) { long count = 0; ParquetRecordBatch batch; while ((batch = reader.read()) != null) { count += batch.getCount(); } System.out.println(count); }
2. 让getFilteredRecordCount()生效(仅适用于可通过统计快速判断的场景)
如果想利用元数据统计快速估算,需要手动构建基于统计的谓词,而非用withRecordFilter():
// 读取文件元数据 ParquetMetadata metadata = ParquetFileReader.readFooter(fileSystem, file); // 构建谓词示例:过滤age大于18的记录(需确保age列有统计信息) FilterPredicate predicate = FilterApi.gt(FilterApi.column("age", INT32), FilterApi.int32(18)); // 计算符合条件的记录数 long count = ParquetFileReader.getFilteredRecordCount(metadata, predicate); System.out.println(count);
注意:这种方式得到的是估算值,如果统计信息不全或条件无法被统计覆盖,结果可能不准确。
内容的提问来源于stack exchange,提问作者tonivade
相关产品推荐
相关产品推荐

