在 R 和 Sparklyr 中,将 table 写入 .CSV (spark_write_csv) 会生成许多文件,而不是一个文件。为什么?我可以改变吗?

In R and Sparklyr, writing a table to .CSV (spark_write_csv) yields many files, not one single file. Why? And can I change that?

背景

我正在 R 中的一个非常大的数据集上进行一些数据操作(连接等),所以我决定使用本地安装的 Apache Spark 和 sparklyr 能够使用我的 dplyr 代码来操纵它。 (我是 运行 Windows 10 Pro;R 是 64 位。)我已经完成了所需的工作,现在要输出 sparklyr table 到 .csv 文件。

问题

这是我用来将 .csv 文件输出到硬盘驱动器上的文件夹的代码:

spark_write_csv(d1, "C:/d1.csv")

但是,当我导航到有问题的目录时,我没有看到一个 csv 文件 d1.csv。相反,我看到了一个新创建的名为 d1 的文件夹,当我在其中单击时,我看到 ~10 个 .csv 文件都以“part”开头。这是屏幕截图:

该文件夹还包含相同数量的 .csv.crc 个文件,我从谷歌搜索中看到这些文件“用于存储拆分文件存档的 CRC 代码”。

这是怎么回事?有没有办法将这些文件重新放在一起,或者让 spark_write_csv 输出单个文件,如 write.csv?

编辑

下面的一位用户建议 this post 可以回答这个问题,而且几乎可以回答,但是提问者似乎正在寻找可以满足我要求的 Scala 代码,而我正在寻找 R 执行我想要的代码。

数据将被分成多个分区。当您将数据帧保存为 CSV 时,您将从每个分区获取文件。在调用 spark_write_csv 方法之前,您需要将所有数据带到单个分区以获得单个文件。

您可以使用称为 coalese 的方法来实现此目的。

coalesce(df, 1)

我遇到了完全相同的问题。

简单来说,分区是为了提高计算效率。如果你有分区,多个workers/executors可以在每个分区上写入table。相比之下,如果你只有一个分区,csv 文件只能由一个 worker/executor 写入,使任务慢得多。同样的原则不仅适用于写 tables,也适用于并行计算。

关于分区的更多详细信息,您可以查看this link

假设我想将 table 保存为路径为 path/to/table.csv 的单个文件。我会这样做

table %>% sdf_repartition(partitions=1)
spark_write_csv(table, path/to/table.csv,...)

您可以在 official documentation 中查看 sdf_repartition 的完整详细信息。