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

Posted

技术标签:

【中文标题】在 R 和 Sparklyr 中,将表写入 .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 和 Sparklyr 中,将表写入 .CSV (spark_write_csv) 会产生许多文件,而不是一个文件。为什么?我可以改变吗? 【发布时间】:2021-10-14 07:24:32 【问题描述】:

背景

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

问题

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

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

但是,当我导航到相关目录时,我看不到单个 csv 文件 d1.csv。相反,我看到了一个名为d1 的新创建的文件夹,当我在其中单击时,我看到~10 个以“part”开头的.csv 文件。截图如下:

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

这里发生了什么?有没有办法将这些文件重新组合在一起,或者让spark_write_csv 输出像write.csv 这样的单个文件?

编辑

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

【问题讨论】:

重新分区数据---> Write single CSV file using spark-csv 抱歉没有看到那个帖子——我对相关之前帖子的搜索都包括 [r] 和 [sparklyr] 标签。看起来不错,先生(或女士)。 【参考方案1】:

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

简单来说,分区是为了计算效率。如果您有分区,则多个工人/执行者可以在每个分区上写入表。相反,如果您只有一个分区,则 csv 文件只能由单个 worker/executor 写入,从而使任务慢得多。同样的原则不仅适用于写表,也适用于并行计算。

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

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

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

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

【讨论】:

【参考方案2】:

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

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

coalesce(df, 1)

【讨论】:

谢谢,莫哈娜。当我回到办公室时,我会试试这个。如果我遇到任何问题,我会报告,但这看起来会起作用。 当我运行 coalesce(d1, 1) 时,我收到此错误:Error: '..1' must be a vector, not a <tbl_spark/tbl_sql/tbl_lazy/tbl> object. 我错过了什么吗? 编辑:R 认为我想要 dplyr::coalesce,当您指的是 Spark 内部的 coalesce 函数时。我知道了。 R 的 spark 前端 sparklyr,显然在 R 端使用 sdf_coalesce 在 Spark 内部调用 coalesce

以上是关于在 R 和 Sparklyr 中,将表写入 .CSV (spark_write_csv) 会产生许多文件,而不是一个文件。为啥?我可以改变吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中使用sparklyr打开“GZ FILE”?

使用 sparklyr 在 R 中将字符串转换为逻辑字符串

从 Sparklyr 中提取和可视化模型树

R - 如何使用 sparklyr 复制火花数据框中的行

为啥 R lubridate::duration 数据类型使用 sparklyr 转换为 spark 中的字符?

Sparklyr - 在 spark-submit 中更改日志级别