首页 > 解决方案 > 加入火花数据帧行顺序

问题描述

我正在使用 spark 数据帧加入,我注意到当使用数据帧 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,我可以避免这个问题。

标签: apache-sparkdataframe

解决方案


这是一个功能,而不是一个问题。一般来说,Spark 中的非本地操作(如果您熟悉原始 RDD 论文,也称为广泛转换)不保证任何特定的处理顺序。

此外,在使用Dataset/SQL API 时,可以根据以下情况以不同的方式执行相同的逻辑计划:

  • 配置。
  • 运行时统计。
  • 注入优化器规则。

等等。如果需要特定顺序,则应始终使用ORDER BY子句明确强制执行。


推荐阅读