【问题标题】:spark save and read parquet on HDFS在 HDFS 上火花保存和读取镶木地板
【发布时间】:2017-03-17 16:47:09
【问题描述】:

我正在写这段代码

val inputData = spark.read.parquet(inputFile)
spark.conf.set("spark.sql.shuffle.partitions",6)
val outputData = inputData.sort($"colname")
outputData.write.parquet(outputFile) //write on HDFS

如果我想从 HDFS 读取文件“outputFile”的内容,我没有找到相同数量的分区并且数据没有排序。这是正常的吗?

我使用的是 Spark 2.0

【问题讨论】:

  • 如何查看分区数和读取文件内容?你是用show()还是take()来显示内容?

标签: apache-spark hdfs parquet


【解决方案1】:

这是 Spark 的一个不幸缺陷。虽然write.parquet 将文件保存为part-00000.parquetpart-00001.parquet、...,但它不保存分区信息,也不保证将磁盘上的part-00000 作为第一个分区读回。

我们为我们的项目添加了以下功能:a)以相同的顺序读回分区(这涉及根据包含的文件名进行一些不安全的分区转换和排序),b)将分区序列化到磁盘并读回它们.

据我所知,目前 Spark 的库存中无法解决此问题。我期待在 Spark 的未来版本中看到解决方案!

编辑:我的经验是使用 Spark 1.5.x 和 1.6.x。如果有办法在原生 Spark 2.0 中做到这一点,请告诉我!

【讨论】:

    【解决方案2】:

    您应该改用repartition()。这将按照您想要的方式编写镶木地板文件:

    outputData.repartition(6).write.parquet("outputFile")
    

    那么,你再读一遍也是一样的。

    Parquet 保留行的顺序。您应该使用take() 而不是show() 来检查内容。 take(n) 返回第一个 n 行,它的工作方式是首先读取第一个分区以了解分区大小,然后分批获取其余数据..

    【讨论】:

    • 如果 OP 想要全局排序的输出有什么帮助?
    • OP 有兴趣使用相同的分区进行回读。这个答案不能解决问题。
    • 这个答案没有回答 OP 的问题。
    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 2020-01-10
    • 2019-02-19
    • 2016-01-18
    • 2019-05-07
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多