目前在做 Spark 升级(3.1.1升级到3.5.0)的时候,遇到了cache table
导致的数据重复问题,这种情况一般来说是很少见的,因为一般很少用cache table
语句。
当然该问题已经在Spark3.5.1已经解决了,可以查看对应的 SPARK-46995和SPARK-45592
从以上的分析知道:是在做join的一方(包含了AQEshuffleRead-coalesced) 影响了join的另一方,导致EnsureRequirements
规则在做执行前检查的时候,会把join的另一个方的shuffle 数据调整为 包含了AQEshuffleRead-coalesced)的一方:
Scan
|
Shuffle(200)
|
Scan AQEShuffleRead(10)
| |
Shuffle(10) InMemoryTableScanExec
\ /
Join
这会导致shuffle后的数据进行了错位(因为之前是shuffle(200),现在变成了shuffle(10)),具体原因笔者还是没有分析清楚,但是其中涉及到的点跟规则EnsureRequirements
以及 CoalesceShufflePartitions
有关,
EnsureRequirements
会做一些执行前的判断,主要是做任务shuffle的协调,
CoalesceShufflePartitions
中 collectCoalesceGroups 会收集 QueryStageExec ,如果是 join 的话,则会join的子节点会收集到一个组里去,这样就能看到 join中会有 AQEShuffleRead coalesced 成对出现