apache-spark - 加入火花数据帧行顺序
问题描述
我正在使用 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,我可以避免这个问题。
解决方案
这是一个功能,而不是一个问题。一般来说,Spark 中的非本地操作(如果您熟悉原始 RDD 论文,也称为广泛转换)不保证任何特定的处理顺序。
此外,在使用Dataset
/SQL API 时,可以根据以下情况以不同的方式执行相同的逻辑计划:
- 配置。
- 运行时统计。
- 注入优化器规则。
等等。如果需要特定顺序,则应始终使用ORDER BY
子句明确强制执行。
推荐阅读
- reactjs - 如何在 intl.formatMessage 中使用占位符
- mysql - 来自组的路径
- xml - 用 powershell 在 XML 字符串中用 \n 替换所有换行符,用 \t 替换制表符
- neo4j - 如何使用弹簧数据neo4j查找2度朋友之间的关系
- javascript - 页面加载jQuery之前的页面预加载器
- java - 弹簧靴 swagger2 404
- python - 如果大于除以值 elif pass
- java - 在 Spring Security 中从 ant 匹配器中排除自定义 url
- google-cloud-platform - 用于大查询和部署管理的 Prod 和 Non Prod 的适当设计
- java - 确保密码不包含字典单词