HDFS上的火花保存和阅读镶木地板

时间:2016-11-03 23:06:45

标签: apache-spark hdfs parquet

我正在写这段代码

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

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

我正在使用Spark 2.0

2 个答案:

答案 0 :(得分: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中使用,请告诉我!

答案 1 :(得分:-4)

您应该使用repartition()代替。这将按您希望的方式编写镶木地板文件:

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

然后,如果您尝试将其读回,那将是相同的。

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