SparkSQL DataFrame按跨分区排序

fo_*_*x86 5 apache-spark apache-spark-sql spark-dataframe

我正在使用spark sql对我的数据集运行查询。查询的结果很小,但仍处于分区状态。

我想合并结果DataFrame并按列对行进行排序。我试过了

DataFrame result = sparkSQLContext.sql("my sql").coalesce(1).orderBy("col1")
result.toJSON().saveAsTextFile("output")
Run Code Online (Sandbox Code Playgroud)

我也试过

DataFrame result = sparkSQLContext.sql("my sql").repartition(1).orderBy("col1")
result.toJSON().saveAsTextFile("output")
Run Code Online (Sandbox Code Playgroud)

输出文件按块排序(即分区是有序的,但数据帧不是整体上有序的)。例如,代替

1, value
2, value
4, value
4, value
5, value
5, value
...
Run Code Online (Sandbox Code Playgroud)

我懂了

2, value
4, value
5, value
-----------> partition boundary
1, value
4, value
5, value
Run Code Online (Sandbox Code Playgroud)
  1. 获取我的查询结果的绝对顺序的正确方法是什么?
  2. 为什么不将数据帧合并到单个分区中?

小智 3

我想在这里提几件事。1-源代码显示 orderBy 语句在内部调用排序 api,并将全局排序设置为 true 。因此,输出级别缺乏排序表明写入目标时排序丢失。我的观点是,对 orderBy 的调用始终需要全局顺序。

2- 使用剧烈的合并(例如在您的情况下强制使用单个分区)可能非常危险。我建议你不要这样做。源代码表明调用 coalesce(1) 可能会导致上游转换使用单个分区。这将是残酷的表现。

3-您似乎期望 orderBy 语句在单个分区上执行。我认为我不同意这种说法。这将使 Spark 成为一个非常愚蠢的分布式框架。

社区如果您同意或不同意声明,请告诉我。

无论如何,你如何从输出中收集数据?

也许输出实际上包含排序的数据,但是您为了从输出中读取而执行的转换/操作会导致顺序丢失。