加入Spark数据框行顺序

时间:2018-07-09 11:32:33

标签: apache-spark dataframe

我正在玩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,可以避免此问题。

3 个答案:

答案 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