cassandra Spark - sortWithInPartitions优先于排序

nukf8bse  于 2022-11-05  发布在  Cassandra
关注(0)|答案(1)|浏览(169)

下面是表示雇员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数据库中获得的。

oprakyz7

oprakyz71#

TL;DR除非有明确的保证,否则您永远不应该假设Spark中的操作将以任何特定的顺序执行,尤其是在使用Spark SQL时。

这里缺少的是shuffle。dropDuplicates实现等效于:

df.groupBy(idCols).agg(first(c) for c in nonIdCols)

其将被执行为:

  • 部分(“Map端”)聚合。
  • 洗牌。
  • 最终(“还原侧”)聚合。

中间混洗引入了非确定性,并且不能保证最终聚合将以任何特定顺序应用。
当在本地模式下使用Spark执行df.sort时,可以实现上述预期输出。
local模式是相当简单的。你永远不应该用它来对Spark内部在完全分布式模式下的行为下结论。
当我使用sortWithInPartitions对初始数据集进行排序并进行重复数据删除时,我得到了预期的数据集。
如果数据之前是按EmployeeID分区的,那么Spark就不需要额外的shuffle。
根据描述,您似乎应该使用How to select the first row of each group?中显示的解决方案之一。

相关问题