假设我们有一个表a,我们正在与一个大表b进行左联接(获取字段colb),然后输出再次与一个大表c左联接(获取字段colc),最后我们将它与一个表d左联接(获取字段cold)
因此,上述3个左连接有助于创建最终的数据集,该数据集由多个使用者共享。
作为这段代码的使用者,我从最终的数据集中选择cola's,cold(我不需要colb和colc)
有没有一个特性可以跳过与b&c的2个连接(因为在我的例子中,colb和colc在下游是不需要的)
仅供参考:
我不想更改实现(即3个连接),因为这个方法是由多个团队使用的。
我不想创建自己的实现(避免代码重复,并跟上团队中使用的逻辑)
为清楚起见,请注意:b,c,d是巨大的dim表a是事实表(相对小于b,c,d)
1条答案
按热度按时间5kgi1eie1#
我不认为这是不可能的,不改变原来的代码。原因是,即使最终结果不包含表b和表c中的列,结果也可能取决于哪些表是联接链的一部分。
举个例子:假设我们有这个数据,我们想用id列连接这四个表。
需要注意的重要一点是,表c在join列中包含一个重复的值。
如果四个表用左联接联接,并且选择了列a和d,则结果将是
另一方面,如果只有表a和表d直接连接而没有表b和表c,则结果将是
因此,即使最终结果不包含表b和表c中的任何列,如果您加入a->d或a->b->c->d,结果也不同。所以spark代码不能跳过表b和c的连接。
好消息是:如果按照a->b->c->d的方式从表b和c中排除列,spark将只处理表b和c的join列,并跳过(例如在shuffle期间)所有其他列。因此,当不从表b和表c中选择列时,处理的数据量至少会减少。