提问人:tiwo 提问时间:12/11/2022 更新时间:2/19/2023 访问量:186
Parquet/arrow:对一列(一个)标志进行筛选
Parquet/arrow: Filtering on a column of (a list of) flags
问:
我在 R 中工作,将 dplyr 管道应用于 R 中的大型 Parquet 文件(数百 GB)。其中一列包含标志列表(主要用于行级别的数据问题)。
我想根据此列表中某些字符串的存在/不存在组合对数据集进行筛选或分组。理想情况下,我想在 dplyr 管道中这样做;但由于 Parquet 数据集不支持所有方法(例如,和 ),这可能是不可能的 - 在这种情况下,我将处理数据帧中的行批处理。unnest
%in%
举个小例子,考虑由
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")
如何筛选具有标志“MANUALLY_CHECKED”或没有标志“QUESTIONABLE”的行的子集?ds
对我来说,可读性比性能更重要。
答:
0赞
korayp
2/19/2023
#1
对于多个分区,我在读取后过滤每个镶木地板文件。
readparquetR(pathtoread="../example_data", format="parquet", where="flag=='MANUALLY_CHECKED'")
该函数使用 lapply 读取它,并使用 data.table 对其进行筛选。像这样的东西
if(nchar(where)>0){
eval(parse(text=paste0("df=df[",where,"]")))
}
当我读取分区的大文件时对我有用 }
评论