我正在玩spark数据框联接,并且我注意到当将join与数据框API一起使用时,行的顺序会发生变化。 下面是我正在处理的示例:
val df = sc.parallelize(Array((0, 1.0, 0.4, 0.1),
(1, 0.9, 0.3, 0.3),
(2, 0.2, 0.9, 0.2),
(3, 0.9, 0.2, 0.2)))
.toDF("id2", "prop1", "prop2", "prop3")
val df2 = sc.parallelize(Array((0, 3.0, 0.2, 0.1),
(1, 0.9, 0.3, 0.3),
(2, 0.2, 0.5, 0.2),
(3, 0.8, 0.1, 0.1),
(4, 0.3, 0.5, 0.5)))
.toDF("id", "prop1_2", "prop2_2", "prop3_2")
val joined = df2.join(df, df("id2")===df2("id"), "outer")
joined.show()
id|prop1_2|prop2_2|prop3_2| id2|prop1|prop2|prop3|
+---+-------+-------+-------+----+-----+-----+-----+
| 1| 0.9| 0.3| 0.3| 1| 0.9| 0.3| 0.3|
| 3| 0.8| 0.1| 0.1| 3| 0.9| 0.2| 0.2|
| 4| 0.3| 0.5| 0.5|null| null| null| null|
| 2| 0.2| 0.5| 0.2| 2| 0.2| 0.9| 0.2|
| 0| 3.0| 0.2| 0.1| 0| 1.0| 0.4| 0.1|
请为避免这种情况请给我任何技巧。 我不确定是否使用数据集API而不是数据框API,可以避免此问题。
答案 0 :(得分:3)
这是一个功能,不是问题。通常,Spark中的非本地操作(如果您熟悉原始的RDD论文,也称为广泛转换)不保证任何特定的处理顺序。
此外,当使用Dataset
/ SQL API时,可以根据以下方式以不同的方式执行相同的逻辑计划:
,依此类推。如果需要特定的命令,则应始终使用ORDER BY
子句明确执行。
答案 1 :(得分:1)
您无法使用join维护顺序,但是,如果顺序很重要,似乎应该在连接后按ID排序。
答案 2 :(得分:1)
您无法避免这种行为。
这被命名为:shuffle
通过火花在整个群集中重新分配数据。
许多操作都会触发随机播放:join,groupBy,cogroup ...
请参阅:https://spark.apache.org/docs/2.1.0/programming-guide.html#shuffle-operations