【问题标题】:Load DataFrame as Text File into HDFS and S3 [duplicate]将 DataFrame 作为文本文件加载到 HDFS 和 S3 [重复]
【发布时间】:2018-02-27 01:07:27
【问题描述】:

我正在尝试使用以下代码将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

我想创建我提到的文件而不是创建目录。谁能帮帮我。

【问题讨论】:

  • 您有预定义的方法将数据帧写入配置单元表。你检查了吗?
  • @philantrovert 是的,OP 可以:1)按照我链接的答案的建议 2)保存到 Hive
  • 从您的示例中看起来这是一个完全相同的副本。我们是否无法理解您在做什么?

标签: scala hadoop apache-spark dataframe hdfs


【解决方案1】:

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

您在保存 rdd 数据之前进行了 repartition 操作,这将触发整个数据之间的 shuffle 操作,最终得到一个具有 只有一个分区的新 rdd。

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

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

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

如果这种方法不是这样设计的,那么如何以简洁、统一、优雅的方式存储多个分区的rdd,也许用户需要指导多个文件名? ……啊,也许太乏味了

我希望这个解释对你有所帮助。


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

hadoop fs -getmerge [src] [des]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多