Apache spark 排序后未对Spark数据帧进行排序

Apache spark 排序后未对Spark数据帧进行排序,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在处理一个JSON文件,以使用Spark(版本1.6.1)生成两个JSON文件。输入文件的大小约为30~40G(100M记录)。对于生成的文件,较大的约为10G~15G(30M记录),较小的约为500M~750M(1.5M记录)。两个结果文件都面临以下问题: 我调用了dataframe的“sort”方法,然后执行“重新分区”将结果合并到单个文件中。然后我检查了生成的文件,发现在一段时间间隔内记录是有序的,但整个文件不是全局有序的。e、 g.文件中最后一条记录(行号1.9M)的键(由3列构成)

我正在处理一个JSON文件,以使用Spark(版本1.6.1)生成两个JSON文件。输入文件的大小约为30~40G(100M记录)。对于生成的文件,较大的约为10G~15G(30M记录),较小的约为500M~750M(1.5M记录)。两个结果文件都面临以下问题:

我调用了dataframe的“sort”方法,然后执行“重新分区”将结果合并到单个文件中。然后我检查了生成的文件,发现在一段时间间隔内记录是有序的,但整个文件不是全局有序的。e、 g.文件中最后一条记录(行号1.9M)的键(由3列构成)为“(ou7QDj48c,014075)”,但文件中中间记录(行号375K)的键为“(pzwzh5vm8,003,023)”

当我使用相对较小的输入源(输入文件400K行)在本地测试代码时,这种情况根本不会发生

我的具体代码如下:

big_json=big_json.sort($“col1”、$“col2”、$“col3”、$“col4”)
big_json.repartition(1.write.mode(“overwrite”).json(“filepath”)
谁能给点建议吗?多谢各位

(我也注意到讨论过一个类似的问题,但到目前为止还没有一个好的解决方案。如果这种现象真的是由于重新分区操作造成的,有谁能帮助我有效地将数据帧转换为单个JSON文件,而不将其转换为RDD,同时保持排序顺序?谢谢)

解决方案

非常感谢@manos@eliasah和@pkrishna的帮助。在阅读了您的评论之后,我曾想过使用coalesce,但在调查了它的性能之后,我放弃了这个想法

最终的解决方案是:对数据帧进行排序并写入JSON,而不进行任何重新分区或合并。完成全部工作后,调用下面的HDFS命令

hdfs-dfs-getmerge/hdfs/file/path/part*/local.json

这个命令比我想象的要好得多。它既不占用太多的时间也不占用太多的空间,而且为我提供了一个很好的单一文件。我刚刚在庞大的结果文件中使用了
,它似乎完全有序。

发生的事情是,在排序操作之后,您正在重新划分

重新分区
随机重新排列RDD中的数据,以创建更多或更少的分区,并在它们之间保持平衡。这总是在网络上洗牌所有数据

在引擎盖下,它使用
coalesce
shuffle
重新分发数据。 这就是数据不再排序的原因


您可以检查代码。

,因为在您的示例中分区计数设置为1,这意味着分区减少为1

为了减少rdd中的分区数量,spark提供了一个保持顺序的转换合并(shuffle=false)


正如eliasah提到的,在引擎盖下使用聚结进行重新分区。它调用coalesce with shuffle=true。因此,可以使用合并转换代替shuffle=false的重新分区。

不要重新分区。让它创建多个文件,然后逐个读取它们,它们应该按正确的排序顺序排列。您可能希望将解决方案部分作为答案发布。
pzwzh5vm8 003 023
...
ou7QDj48c 014 075