【问题标题】:Parquet/arrow: Filtering on a column of (a list of) flagsParquet/arrow:过滤一列(一列)标志
【发布时间】:2023-02-19 06:57:16
【问题描述】:

我在 R 中工作,将 dplyr 管道应用于 R 中的大型 Parquet 文件(数百 GB)。其中一列包含标志列表(主要用于行级别的数据问题)。

我想根据此列表中某些字符串的存在/不存在组合来过滤或分组数据集。理想情况下,我想在 dplyr 管道内这样做;但由于 Parquet 数据集不支持所有方法(例如 unnest%in%),这可能是不可能的 - 在这种情况下,我将处理数据框中的成批行。

举一个小例子,考虑由创建的 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”的行子集?

可读性对我来说比性能更重要。

【问题讨论】:

    标签: r list dplyr parquet nested-lists


    【解决方案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,"]")))
    }
    

    当我阅读分区的大文件时对我有用 }

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 2020-12-08
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多