下面是表示雇员in_date和out_date的示例数据集。我必须获得所有雇员的last in_time。
Spark在4节点独立集群上运行。
初始数据集:
员工ID-----入职日期-----离职日期
1111111 2017-04-20 2017-09-14
1111111 2017-11-02 null
2222222 2017-09-26 2017-09-26
2222222 2017-11-28 null
3333333 2016-01-07 2016-01-20
3333333 2017-10-25 null
df.sort(col(in_date).desc())
之后的数据集:
员工ID--入职日期-----离职日期
第一个
输出:
员工ID-----入职日期-----离职日期
1111111 2017-11-02 null
2222222 2017-09-26 2017-09-26
3333333 2016-01-07 2016-01-20
预期的数据集:
员工ID-----入职日期-----离职日期
1111111 2017-11-02 null
2222222 2017-11-28 null
3333333 2017-10-25 null
但是当我使用sortWithInPartitions
对初始数据集进行排序并进行重复数据删除时,我得到了预期的数据集。我是否遗漏了什么大的或小的内容?任何帮助都将不胜感激。
- 其他信息:* 当在本地模式下使用Spark执行df.sort时,可以实现上述预期输出。
我没有做任何划分,重新划分。初始数据集是从底层的Cassandra数据库中获得的。
1条答案
按热度按时间oprakyz71#
TL;DR除非有明确的保证,否则您永远不应该假设Spark中的操作将以任何特定的顺序执行,尤其是在使用Spark SQL时。
这里缺少的是shuffle。
dropDuplicates
实现等效于:其将被执行为:
中间混洗引入了非确定性,并且不能保证最终聚合将以任何特定顺序应用。
当在本地模式下使用Spark执行df.sort时,可以实现上述预期输出。
local
模式是相当简单的。你永远不应该用它来对Spark内部在完全分布式模式下的行为下结论。当我使用sortWithInPartitions对初始数据集进行排序并进行重复数据删除时,我得到了预期的数据集。
如果数据之前是按
EmployeeID
分区的,那么Spark就不需要额外的shuffle。根据描述,您似乎应该使用How to select the first row of each group?中显示的解决方案之一。