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

如何使(Spark1.6)saveAsTextFile附加现有文件?

叶弘深
2023-03-14

文件名太复杂和随机,我无法使用api获取。所以我想使用saveAstextfile,因为文件名并不复杂且规则,但我不知道如何在同一目录中追加文件?感谢您抽出时间。

共有3个答案

汤枫
2023-03-14

你可以试试我在某处找到的这个方法。处理Spark Streaming rdd并存储到单个HDFS文件

    import org.apache.hadoop.fs.{ FileSystem, FileUtil, Path }

def saveAsTextFileAndMerge[T](hdfsServer: String, fileName: String, rdd: RDD[T]) = {
  val sourceFile = hdfsServer + "/tmp/"
  rdd.saveAsTextFile(sourceFile)
  val dstPath = hdfsServer + "/final/"
  merge(sourceFile, dstPath, fileName)
}

def merge(srcPath: String, dstPath: String, fileName: String): Unit = {
  val hadoopConfig = new Configuration()
  val hdfs = FileSystem.get(hadoopConfig)
  val destinationPath = new Path(dstPath)
  if (!hdfs.exists(destinationPath)) {
    hdfs.mkdirs(destinationPath)
  }
  FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath + "/" + fileName), false, hadoopConfig, null)
}
卫宁
2023-03-14

由于spark使用HDFS,这是它产生的典型输出。您可以使用FileUtil将文件合并回一个文件。这是一个有效的解决方案,因为它不需要spark通过将整个数据划分为1来将其收集到单个内存中。这是我遵循的方法。

import org.apache.hadoop.fs.{FileSystem, FileUtil, Path}   

val hadoopConf = sqlContext.sparkContext.hadoopConfiguration
val hdfs = FileSystem.get(hadoopConf)
val mergedPath = "merged-" + filePath + ".json"
val merged = new Path(mergedPath)
if (hdfs.exists(merged)) {
  hdfs.delete(merged, true)
}
df.wirte.mode(SaveMode.Append).json(filePath)

FileUtil.copyMerge(hdfs, path, hdfs, merged, false, hadoopConf, null)

您可以使用mergedPath位置读取单个文件。希望有帮助。

赵镜
2023-03-14

在Spark 1.5上工作过,我认为这是正确的用法...

dataframe.write().mode(SaveMode.Append).format(FILE_FORMAT).**partitionBy**("parameter1", "parameter2").save(path);
 类似资料:
  • 问题内容: 至于现在,我将在尝试附加对象时得到提示。我已经在互联网上搜索了一种解决方法。到目前为止,我发现的答案是无法完成。解决此问题的一种方法是将对象写入列表,然后将列表写入文件。 但是,每次添加新对象时,我都必须覆盖该文件。这似乎不是加班的最佳解决方案。 有没有一种方法可以将对象追加到现有对象流? 问题答案: 实际上,这很容易做到。当您添加到现有流时,需要使用ObjectOutStream的子

  • 我正在使用下面的代码。然而,当我运行代码时,我想在同一个TXT文件中一个接一个地添加新的XML。这是否可以使用JDOM。请帮帮我。。 xmlOutput。输出(文档,新FileWriter(“c:\updated.txt”));是否需要修改?

  • 代码是来自ASP.NET MVC应用程序的操作方法。

  • 在Spark中使用Scala时,每当我使用转储结果时,它似乎将输出分成多个部分。我只是向它传递一个参数(路径)。 输出数量是否与其使用的减速器数量相对应 这是否意味着输出被压缩 我知道我可以使用bash将输出组合在一起,但是有没有一个选项可以将输出存储在单个文本文件中,而不进行拆分??我看了API文档,但它并没有说太多

  • 问题内容: 我正在写某种生成加密日志文件的记录器。不幸的是,密码学不是我的强项。现在,我可以向文件写入几条消息,然后关闭文件。然后我可以打开它,附加一些消息,再次关闭,解密后,我在文件中间看到填充字节。有什么方法可以处理加密文件,而不必每次我想添加一些消息时都对其解密? 编辑 :更多细节。当前实现使用CipherOutputStream。据我了解,没有办法 寻求 使用它。如果我将控制输出数据大小可

  • 问题内容: 在Linux中将文本附加到文件的最简单方法是什么? 我看了这个问题,但是可接受的答案使用了一个附加程序(),我相信应该有一个更简单的方法或类似方法。 问题答案: cat >> filename This is text, perhaps pasted in from some other source. Or else entered at the keyboard, doesn’t