跳转至内容

此函数允许您写入数据集。 通过写入更高效的二进制存储格式,并指定相关的分区,您可以使其读取和查询速度更快。

用法

write_dataset(
  dataset,
  path,
  format = c("parquet", "feather", "arrow", "ipc", "csv", "tsv", "txt", "text"),
  partitioning = dplyr::group_vars(dataset),
  basename_template = paste0("part-{i}.", as.character(format)),
  hive_style = TRUE,
  existing_data_behavior = c("overwrite", "error", "delete_matching"),
  max_partitions = 1024L,
  max_open_files = 900L,
  max_rows_per_file = 0L,
  min_rows_per_group = 0L,
  max_rows_per_group = bitwShiftL(1, 20),
  ...
)

参数

dataset

DatasetRecordBatchTablearrow_dplyr_querydata.frame。 如果是 arrow_dplyr_query,将评估查询并写入结果。 这意味着您可以在写入数据之前使用 select()filter()mutate() 等来转换数据(如果需要)。

path

字符串路径、URI 或 SubTreeFileSystem,引用要写入的目录(如果目录不存在,将创建该目录)

format

文件格式的字符串标识符。 默认为使用 "parquet"(参见 FileFormat

partitioning

Partitioning 或用作分区键的列的字符向量(将写为路径段)。 默认为使用当前的 group_by() 列。

basename_template

要写入的文件名的字符串模板。 必须包含 "{i}",它将被替换为自动递增的整数以生成数据文件的基本名称。 例如,"part-{i}.arrow" 将生成 "part-0.arrow", ...。 如果未指定,则默认为 "part-{i}.<默认扩展名>"

hive_style

逻辑值:将分区段写入为 Hive 样式 (key1=value1/key2=value2/file.ext) 或仅作为裸值。 默认为 TRUE

existing_data_behavior

目标目录中已有数据时要使用的行为。 必须是 "overwrite"、"error" 或 "delete_matching" 之一。

  • “overwrite”(默认值)则创建的任何新文件将覆盖现有文件

  • “error”则如果目标目录不为空,操作将失败

  • “delete_matching”则如果要将数据写入这些分区,写入器将删除任何现有分区,并将不写入数据的分区保留不变。

max_partitions

任何批次可以写入的最大分区数。 默认为 1024L。

max_open_files

写入操作期间可以保持打开状态的最大文件数。 如果大于 0,则这将限制可以保持打开状态的最大文件数。 如果尝试打开的文件过多,则将关闭最近最少使用的文件。 如果此设置设置得太低,您最终可能会将数据 fragmentation 成许多小文件。 默认值为 900,这还允许扫描程序在达到默认 Linux 限制 1024 之前打开一些文件。

max_rows_per_file

每个文件的最大行数。 如果大于 0,则这将限制放置在任何单个文件中的行数。 默认为 0L。

min_rows_per_group

累积到此行数时,将行组写入磁盘。 默认为 0L。

max_rows_per_group

单个组中允许的最大行数,当超过此行数时,它将被拆分,并将下一组行写入下一个组。 此值必须设置为大于 min_rows_per_group。 默认为 1024 * 1024。

...

其他特定于格式的参数。 有关可用的 Parquet 选项,请参阅 write_parquet()。 可用的 Feather 选项有

  • use_legacy_format 逻辑值:写入格式化的数据,以便 0.14 及更低版本的 Arrow 库可以读取它。 默认为 FALSE。 您还可以通过设置环境变量 ARROW_PRE_0_15_IPC_FORMAT=1 来启用此功能。

  • metadata_version:像“V5”这样的字符串或指示 Arrow IPC MetadataVersion 的等效整数。 默认值 (NULL) 将使用最新版本,除非环境变量 ARROW_PRE_1_0_METADATA_VERSION=1,在这种情况下它将是 V4。

  • codec:将用于压缩写入文件的主体缓冲区的 Codec。 默认值 (NULL) 不会压缩主体缓冲区。

  • null_fallback:使用 Hive 样式分区时,用于代替缺失值(NANULL)的字符。 请参阅 hive_partition()

返回值

输入的 dataset,不可见

示例

# You can write datasets partitioned by the values in a column (here: "cyl").
# This creates a structure of the form cyl=X/part-Z.parquet.
one_level_tree <- tempfile()
write_dataset(mtcars, one_level_tree, partitioning = "cyl")
list.files(one_level_tree, recursive = TRUE)
#> [1] "cyl=4/part-0.parquet" "cyl=6/part-0.parquet" "cyl=8/part-0.parquet"

# You can also partition by the values in multiple columns
# (here: "cyl" and "gear").
# This creates a structure of the form cyl=X/gear=Y/part-Z.parquet.
two_levels_tree <- tempfile()
write_dataset(mtcars, two_levels_tree, partitioning = c("cyl", "gear"))
list.files(two_levels_tree, recursive = TRUE)
#> [1] "cyl=4/gear=3/part-0.parquet" "cyl=4/gear=4/part-0.parquet"
#> [3] "cyl=4/gear=5/part-0.parquet" "cyl=6/gear=3/part-0.parquet"
#> [5] "cyl=6/gear=4/part-0.parquet" "cyl=6/gear=5/part-0.parquet"
#> [7] "cyl=8/gear=3/part-0.parquet" "cyl=8/gear=5/part-0.parquet"

# In the two previous examples we would have:
# X = {4,6,8}, the number of cylinders.
# Y = {3,4,5}, the number of forward gears.
# Z = {0,1,2}, the number of saved parts, starting from 0.

# You can obtain the same result as as the previous examples using arrow with
# a dplyr pipeline. This will be the same as two_levels_tree above, but the
# output directory will be different.
library(dplyr)
two_levels_tree_2 <- tempfile()
mtcars %>%
  group_by(cyl, gear) %>%
  write_dataset(two_levels_tree_2)
list.files(two_levels_tree_2, recursive = TRUE)
#> [1] "cyl=4/gear=3/part-0.parquet" "cyl=4/gear=4/part-0.parquet"
#> [3] "cyl=4/gear=5/part-0.parquet" "cyl=6/gear=3/part-0.parquet"
#> [5] "cyl=6/gear=4/part-0.parquet" "cyl=6/gear=5/part-0.parquet"
#> [7] "cyl=8/gear=3/part-0.parquet" "cyl=8/gear=5/part-0.parquet"

# And you can also turn off the Hive-style directory naming where the column
# name is included with the values by using `hive_style = FALSE`.

# Write a structure X/Y/part-Z.parquet.
two_levels_tree_no_hive <- tempfile()
mtcars %>%
  group_by(cyl, gear) %>%
  write_dataset(two_levels_tree_no_hive, hive_style = FALSE)
list.files(two_levels_tree_no_hive, recursive = TRUE)
#> [1] "4/3/part-0.parquet" "4/4/part-0.parquet" "4/5/part-0.parquet"
#> [4] "6/3/part-0.parquet" "6/4/part-0.parquet" "6/5/part-0.parquet"
#> [7] "8/3/part-0.parquet" "8/5/part-0.parquet"