Parquet地板/箭头:对标志列(列表)进行过滤

2nc8po8w  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(168)

我在R中工作,将dplyr管道应用于R中的大型Parquet文件(数百GB)。其中一列包含标志列表(主要用于行级别的数据问题)。
我想根据这个列表中某些字符串的存在/不存在组合来过滤或分组数据集。理想情况下,我想在dplyr管道中完成此操作;但由于Parquet数据集不支持所有方法(例如unnest%in%),这可能是不可能的-在这种情况下,我将在 Dataframe 中处理成批的行。
举个小例子,考虑由创建的Parquet文件(或数据框

library(dplyr)
library(arrow)

example_data <- tibble(
  i=c(10, 11, 12, 13, 14),
  flags=list(
    list(),
    list("QUESTIONABLE"),
    list("MANUALLY_CHECKED", "QUESTIONABLE"),
    NULL,
    list("QUESTIONABLE", "UNRELATEDFLAG")
  )
)

write_parquet(example_data, "withlistcol.parquet")
example_data %>% unnest(flags, keep_empty=T)

并重新读取

ds <- open_dataset("withlistcol.parquet")

如何过滤ds中具有标志“MANUALLY_CHECKED”或没有标志“QUESTIONABLE”的行的子集?
可读性对我来说比性能更重要。

thtygnil

thtygnil1#

对于多个分区,我在阅读每个parquet文件后对其进行过滤。

readparquetR(pathtoread="../example_data", format="parquet", where="flag=='MANUALLY_CHECKED'")

这个函数用lapply读取它并使用data.table过滤它。

if(nchar(where)>0){             
eval(parse(text=paste0("df=df[",where,"]")))
}

当我读取分区的大文件时适用}

相关问题