将DataFrame作为文本文件加载到HDFS和S3中

时间:2017-09-18 13:14:50

标签: scala hadoop apache-spark dataframe hdfs

我正在尝试使用以下代码将DataFrame加载到HDFSS3作为文本格式文件。 DataFrame名称为 finalData

val targetPath = "/user/test/File"
val now = Calendar.getInstance().getTime()
val formatter = new SimpleDateFormat("yyyyMMddHHmmss")
val timeStampAfterFormatting = formatter.format(now)
val targetFile = s"""$targetPath/test_$timeStampAfterFormatting.txt"""
finalData.repartition(1).rdd.saveAsTextFile(targetFile)

使用上面的代码我可以成功加载数据。但文件名与我提供的不同,也不是文本格式。使用我提到的名称创建了一个目录。

  

目录名称 - /user/test/File/test_20170918055206.txt

     

-bash-4.2 $ hdfs dfs -ls /user/test/File/test_20170918055206.txt

     

找到2项

     

/user/test/File/test_20170918055206.txt/_SUCCESS

     

/user/test/File/test_20170918055206.txt/part-00000

我想创建我提到的文件,而不是创建目录。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

在我看来,这是作为设计工作

在您保存rdd数据之前,您有一个重新分区操作,这将触发整个数据之间的随机操作,并最终得到一个新的rdd 只有一个分区< /强>

因此,只有一个分区作为 saveAsTextFile 操作存储在您的HDFS中。

这种方法的设计方式是让任意数量的分区以统一的方式写入。

例如,如果您的rdd有100个分区,在写入HDFS之前没有合并或重新分区然后你会得到一个目录包含_SUCCESS标志和100个文件!

如果这种方法不是这样设计的,那么多个分区的rdd如何以简洁,统一和优雅的方式存储,并且用户可能需要指导多个文件名? ......啊,这么乏味可能

我希望这个解释可以帮助你。

如果您需要和本地文件系统上的完整整个文件,只需尝试hadoop客户端命令:

hadoop fs -getmerge [src] [des]