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

时间:2016-05-04 02:22:23

标签: apache-spark apache-spark-sql spark-streaming spark-dataframe

在SparkSQL中,我使用DF.wirte.mode(SaveMode.Append).json(xxxx),但此方法会将这些文件视为 enter image description here

文件名太复杂和随机,我无法使用api来获取。所以我想使用saveAstextfile,因为文件名不复杂且常规,但我不知道如何附加文件同样的指导?欣赏你的时间。

3 个答案:

答案 0 :(得分:2)

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

dataframe.write().mode(SaveMode.Append).format(FILE_FORMAT).**partitionBy**("parameter1", "parameter2").save(path);

答案 1 :(得分:2)

你可以试试我从某处找到的这种方法。 Process Spark Streaming rdd and store to single HDFS file

    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)
}

答案 2 :(得分:1)

由于spark使用HDFS,因此这是它产生的典型输出。您可以使用FileUtil将文件合并为一个。这是一种有效的解决方案,因为它不需要通过将其分成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位置阅读单个文件。希望它有所帮助。