dag中的冗余交换

xxb16uws  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(481)

我有两个中等大小的表(tablea和tableb),我在同一个join键上连接tableb和tablea两次。

...
from tableA A
left join tableB B1 on A.col1 = B1.col1
left join tableB B2 on A.col2 = B2.col1

我看到那张table在spark dag里被换了两次。

因为交换是在同一个连接键(col1)上进行的,所以我很好奇是否可以避免第二次交换?

bwntbbo3

bwntbbo31#

是的,原则上这是可能的,您可以考虑两种方法:
缓存-您可以重新分区表b,然后缓存它,并在联接中使用此缓存表。这将确保它只被洗牌一次。但是,它不太适合于不适合内存的大型表。
重用交换-如果交换是相同的,spark将重用 Exchange 自动地。在你的情况下,我可以从计划中看出,他们是不一样的,因为第二个 Exchange 正在显示更多数据(秒419mb) Exchange 在第一个版本中为325mb Exchange ). 例如,这可能是由不同的投影引起的(可能以后在每个情况下选择不同的列,然后 columnPruning 规则将删除列)。如果您能确保两个交换机是相同的(在 Exchange 运算符与第二个运算符具有相同的表达式 Exchange spark将重用它,您将在计划中看到 ReusedExchange 接线员。
你可以看看我最近关于重用 Exchange .

相关问题