在 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) 会产生许多文件,而不是一个文件。为啥?我可以改变吗?的主要内容,如果未能解决你的问题,请参考以下文章