2016-11-03 75 views
3

阅读拼花我写这段代码火花上保存和HDFS

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

+0

你如何检查分区的数量和阅读文件的内容?你使用show()或者take()来显示内容吗? –

回答

-3

你应该利用repartition()代替。这会按照你想要的方式写入镶木地板文件:

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

然后,如果您尝试读取它,情况也是如此。

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

+0

如果OP想要全局排序的输出,它有什么用处? – 2016-11-04 01:02:09

+0

该OP有兴趣用相同的分区回读。这个答案不能解决问题。 – Tim

+0

这个答案不回答OP的问题。 – eliasah

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,请告诉我!