如何在R中使用arrow包无需collect即可获取分区Parquet文件列名
解决方案
arrow::open_dataset()返回的Dataset对象本身支持直接读取列名,完全不需要调用collect()加载全量数据,该操作仅解析数据集元信息,哪怕是TB级的多分区Parquet数据集也可以毫秒级返回结果。
代码实现
# 仅加载数据集元数据,不会读取任何实际存储的行数据 ds <- arrow::open_dataset(sources = "C:/Data/parquet/mtcars") # 直接获取包含分区字段的列名向量 col_names <- colnames(ds)
返回结果和你原有实现的输出完全一致:
[1] "mpg" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" "cyl"
原方法性能差的原因
原有实现调用dplyr::collect()会把全量数据集所有分区的所有数据全部加载到R内存中,再提取列名,产生了大量不必要的IO和内存开销,数据量越大耗时越高。
补充说明
如果你的数据集存在不同分区文件schema不一致的情况,可以在open_dataset中添加unify_schemas = TRUE参数,强制统一所有文件的schema后再提取列名即可。
内容的提问来源于stack exchange,提问作者Ryan Garnett
相关产品推荐
相关产品推荐

