JAVA write为啥无法写入数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA write为啥无法写入数据?相关的知识,希望对你有一定的参考价值。

参考技术A

当前要写入的文件流没有被关闭,之后再次写入的时候就会出现这个无法写入的问题。

JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一些Java工具和Java的核心类库(Java API)。

不论什么Java应用服务器实质都是内置了某个版本的JDK。主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK。

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

【中文标题】在 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

以上是关于JAVA write为啥无法写入数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何用java向指定的EXCEL单元格中写入数据?

为啥 C++ ofstream write() 方法会修改我的原始数据?

怎么用java把数据库里的数据写入到excel表中

JAVA实现向文本文件中多次写入数据

记第一个问题——python文件无法写入数据

python write 写入为啥会报这个错'gbk'codec can't encode character \xbb'i