R中使用dplyr::collect读取parquet数据时限制返回行数的方案咨询
你目前使用的先调用head()再执行collect()的写法已经是当前最高效的实现方案,没有性能更优的处理方式。
背后的逻辑说明
arrow::open_dataset采用懒执行机制,在调用collect()触发数据加载前,所有的操作指令都会下推到arrow内置的查询引擎处理,不会提前加载全量数据到R内存。你在读取数据集后直接调用head(1000),引擎只会扫描parquet文件中刚好满足1000行的分片数据,完全不会读取后续的数百万行内容,资源占用和执行速度都是最优水平。- 你之前尝试的
collect(n=1000)不生效是因为dplyr的collect()方法的n参数目前仅适配了DBI系列的数据库后端,arrow数据集的collect()方法暂不支持该参数,因此配置后不会生效。 - 先
collect()再head()的写法之所以效率低,是因为该逻辑会先把整个parquet数据集的所有行全部加载到R内存中,再截取前1000行,大文件场景下自然会占用大量不必要的内存、执行速度极慢。
可选的等价语义写法
如果你想要更贴合dplyr语法的写法,可以用slice_head代替head,二者执行效率完全一致:
arrow::open_dataset(source = "C:/data/parquet/members") %>% dplyr::slice_head(n = 1000) %>% dplyr::collect()
内容的提问来源于stack exchange,提问作者Ryan Garnett
相关产品推荐
相关产品推荐

