我正在写这段代码
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
答案 0 :(得分:1)
这是Spark的一个不幸的缺陷。虽然write.parquet
将文件保存为part-00000.parquet
,part-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
行,它的工作方式是首先读取第一个分区以了解分区大小,然后批量获取其余数据。