我正在尝试使用以下代码将DataFrame
加载到HDFS
和S3
作为文本格式文件。 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
我想创建我提到的文件,而不是创建目录。任何人都可以帮助我。
答案 0 :(得分:1)
在我看来,这是作为设计工作。
在您保存rdd数据之前,您有一个重新分区操作,这将触发整个数据之间的随机操作,并最终得到一个新的rdd 只有一个分区< /强>
因此,只有一个分区作为 saveAsTextFile 操作存储在您的HDFS中。
这种方法的设计方式是让任意数量的分区以统一的方式写入。
例如,如果您的rdd有100个分区,在写入HDFS之前没有合并或重新分区。 然后你会得到一个目录包含_SUCCESS标志和100个文件!
如果这种方法不是这样设计的,那么多个分区的rdd如何以简洁,统一和优雅的方式存储,并且用户可能需要指导多个文件名? ......啊,这么乏味可能
我希望这个解释可以帮助你。
如果您需要和本地文件系统上的完整整个文件,只需尝试hadoop客户端命令:
hadoop fs -getmerge [src] [des]