Apache spark 如何使用Spark将输出作为一个单独的文件写入现有HDFS目录下?

Apache spark 如何使用Spark将输出作为一个单独的文件写入现有HDFS目录下?,apache-spark,hadoop,hdfs,Apache Spark,Hadoop,Hdfs,我有一个用例,需要将输出作为一个单独的文件写入现有HDFS目录下。当我使用sparkContext.saveAsHadoopFile()方法时,会抛出一个异常,表示输出目录已存在。目前,我可以使用Hadoop客户端库来完成它,并将其作为Spark的任务启动,下面是代码示例代码段。我想知道我们是否可以使用Spark的库函数来完成这项工作 代码使用标准Hadoop客户端库 val hdfs = FileSystem.get(getHDFSConfiguration(hadoopConf)) val

我有一个用例,需要将输出作为一个单独的文件写入现有HDFS目录下。当我使用sparkContext.saveAsHadoopFile()方法时,会抛出一个异常,表示输出目录已存在。目前,我可以使用Hadoop客户端库来完成它,并将其作为Spark的任务启动,下面是代码示例代码段。我想知道我们是否可以使用Spark的库函数来完成这项工作

代码使用标准Hadoop客户端库

val hdfs = FileSystem.get(getHDFSConfiguration(hadoopConf))
val outputFile = new Path(newPath)

hdfs.createNewFile(outputFile)

hdfs.append(outputFile)
      .writeBytes(content)

Spark版本:2.3.x

一种方法是创建一个数据帧并将其数据保存到一个文件中

df.write.mode("append").csv("pathToFile")
请注意,如果不将coalesce设置为1,您将获得一些文件,而不是一个文件。要做到这一点,你需要

df.coalesce(1).write.mode("append").csv("pathToFile")

我假设您希望将数据保存为csv,但还有其他多种格式,如拼花、avro、orc等,在某些方面比csv更有效。如果您使用的Hadoop版本>0.20.0,则可以在hdfs-site.xml中设置此属性

<property>
   <name>dfs.support.append</name>
   <value>true</value>
</property>

dfs.support.append
真的
然后可以使用文件系统的.append将数据添加到现有的数据路径中