当前位置: 首页 > 知识库问答 >
问题:

如何将数据写入Spark中的单个(普通)csv文件?[副本]

楮自珍
2023-03-14

我正在尝试将数据帧保存为本地驱动器中的CSV文件。但是,当我这样做时,我会生成一个文件夹并在该分区文件中写入。有什么建议可以克服这个问题吗?

我的要求是:获得一个普通的csv文件,文件的实际名称在代码中给出。

代码段:<代码>数据帧。聚结(1)。写模式(“覆盖”)。格式(“com.databricks.spark.csv”)。选项(“标题”、“true”)。csv(“E:/dataframe.csv”)

共有3个答案

寿阳华
2023-03-14

这是不可能的,但你可以这样做:

dataframe.coalesce(1).write.mode("overwrite").format("com.databricks.spark.csv").option("header", "true").csv("E:/data/")

import org.apache.hadoop.fs._
val fs = FileSystem.get(sc.hadoopConfiguration)
val filePath = "E:/data/"
val fileName = fs.globStatus(new Path(filePath+"part*"))(0).getPath.getName
fs.rename(new Path(filePath+fileName), new Path(filePath+"dataframe.csv"))
齐招
2023-03-14

没有自动的方法可以做到这一点。我看到两种解决方案

  • 如果本地目录已装载到所有执行器上:按原样写入文件,然后将部分csv文件移动/重命名为所需名称

但是这两种解决方案都破坏了并行性,从而破坏了火花的目标。

戴鸿羽
2023-03-14

TL:博士,您正试图在分布式环境中实施连续的核心概念。它不会有好的结局。

Spark不提供像这样的实用程序。为了能够以半分布式方式创建一个,您必须实现多步、依赖于源的协议,其中:

  • 您写入标题
  • 为每个分区编写数据文件
  • 您可以合并这些文件,并指定一个新名称

由于这具有有限的应用程序,仅对小文件有用,并且对于某些源(如对象存储)可能非常昂贵,因此在Spark中没有实现这样的功能。

您当然可以收集数据,使用标准CSV解析器(Univoicity、Apache Commons),然后放入您选择的存储中。这是连续的,需要多次数据传输。

 类似资料:
  • 我正在使用Spark 2.3,我需要将Spark数据帧保存到csv文件中,我正在寻找更好的方法。。查看相关/类似的问题,我发现了这个问题,但我需要一个更具体的: 如果DataFrame太大,如何避免使用Pandas?因为我使用了函数(下面的代码),它产生了: 内存不足错误(无法分配内存)。 使用文件I/O直接写入csv是更好的方法吗?它可以保留分隔符吗? 使用df。聚结(1)。写选项(“标题”、“

  • 我试图做一些非常简单的事情,我有一些非常愚蠢的挣扎。我想这一定与对火花的基本误解有关。我非常感谢任何帮助或解释。 我有一张非常大的桌子(~3 TB,~300毫米行,25k个分区),在s3中保存为拼花地板,我想给一些人一个很小的拼花文件样本。不幸的是,这要花很长时间才能完成,我不明白为什么。我尝试了以下方法: 然后当这不起作用时,我尝试了这个,我认为应该是一样的,但我不确定。(我添加了,以尝试调试。

  • 问题内容: 我有一个结果RDD 。输出格式如下: 我想要的是创建一个CSV文件,其中一列用于(上面输出中的元组的第一部分),另一列用于(元组输出的第二部分)。但我不知道如何使用Python在Spark中写入CSV文件。 如何使用上述输出创建CSV文件? 问题答案: 然后只需将RDD()的行转换为字符串(CSV的行)即可。

  • 我正在尝试将以下数据写入csv文件。这些数据是employdetails name1-surname1-place1 名称4-surname4-place4 我希望输出在CSV文件上,一个在另一个下面,在单独的行上。 我写了下面的代码 -KD

  • 我在pandas中有一个数据帧,我想把它写到CSV文件中。我使用的是: 并得到错误: 有没有什么方法可以很容易地解决这个问题(例如,我的数据帧中有unicode字符)?还有,有没有一种方法可以使用“to-tab”方法(我认为不存在)写入以制表符分隔的文件,而不是CSV?