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