在SparkSQL中,我使用DF.wirte.mode(SaveMode.Append).json(xxxx),但此方法会将这些文件视为
文件名太复杂和随机,我无法使用api来获取。所以我想使用saveAstextfile,因为文件名不复杂且常规,但我不知道如何附加文件同样的指导?欣赏你的时间。
答案 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
位置阅读单个文件。希望它有所帮助。