在R中批量编写Apache Arrow数据集



我想知道批量创建Apache Arrow多文件数据集的正确方法是什么。本教程很好地解释了如何从内存中的数据编写新的分区数据集,但是否可以批量执行?

我目前的方法是简单地将数据集单独写入,但写入同一目录。这个似乎正在运行,但我不得不想象这会导致该功能的元数据出现问题。本质上,我的逻辑如下(伪代码(:

data_ids <- c(123, 234, 345, 456, 567)
# write data in batches
for (id in data_ids) {
## assume this is some complicated computation that returns 1,000,000 records
df <- data_load_helper(id)
df <- group_by(df, col_1, col_2, col_3)
arrow::write_dataset(df, "arrow_dataset/", format = 'arrow')
}
# read in data
dat <- arrow::open_dataset("arrow_dataset/", format="arrow", partitioning=c("col_1", "col_2", "col_3"))
# check some data
dat %>%
filter(col_1 == 123) %>%
collect()

正确的方法是什么?或者我的方法正确吗?将所有数据加载到一个对象中,然后一次写入是不可行的,而且某些数据块会随着时间的推移在不同的时间段更新。

TL;DR:你的解决方案看起来很合理。

你可能会遇到一两个问题。首先,如果您的批不是都有相同的模式,那么在打开数据集进行读取时,您需要确保传入unify_schemas=TRUE。这也可能会变得昂贵,并且您可能只想单独保存统一模式。

某些数据块将在不同的时间段进行更新。

如果通过";"更新";你的意思是";添加更多数据";那么您可能需要提供CCD_ 2。否则,对write_dataset的每个调用都将尝试创建part-0.arrow,并且它们将相互覆盖。解决此问题的常见做法是在basename_template中包含某种UUID。

如果通过";"更新";你的意思是";替换现有数据";那么事情就有点棘手了。如果要替换整个分区的数据,可以使用existing_data_behavior="delete_matching"。如果你想替换匹配的行,我不确定目前是否有一个好的解决方案。

这种方法也可能导致小批量,这取决于每个data_id中每个组中的数据量。例如,如果您有100000个数据id,并且每个数据id有100万条记录,分布在1000个col_1/col_2/col_3组合中,那么您最终会得到100万个文件,每个文件有1000行。这不会有好的表现。理想情况下,您希望最终得到1000个文件,每个文件有1000000行。你也许可以通过一些偶尔的压缩步骤来解决这个问题。

最新更新