spark中有没有一个特性可以跳过左连接,以防左连接添加的字段不是必需的

5jdjgkvh  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(274)

假设我们有一个表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)

5kgi1eie

5kgi1eie1#

我不认为这是不可能的,不改变原来的代码。原因是,即使最终结果不包含表b和表c中的列,结果也可能取决于哪些表是联接链的一部分。
举个例子:假设我们有这个数据,我们想用id列连接这四个表。

Table A     Table B     Table C     Table D
+---+----+  +---+----+  +---+----+  +---+----+
| id|colA|  | id|colB|  | id|colC|  | id|colD|
+---+----+  +---+----+  +---+----+  +---+----+
|  1|  A1|  |  1|  B1|  |  1|  C1|  |  1|  D1|
|  2|  A2|  |  2|  B2|  |  2|  C2|  |  2|  D2|
+---+----+  +---+----+  |  2| C2b|  +---+----+
                        +---+----+

需要注意的重要一点是,表c在join列中包含一个重复的值。
如果四个表用左联接联接,并且选择了列a和d,则结果将是

+---+----+----+----+----+     +---+----+----+
| id|colA|colB|colC|colD|     | id|colA|colD|
+---+----+----+----+----+     +---+----+----+
|  1|  A1|  B1|  C1|  D1| ==> |  1|  A1|  D1|
|  2|  A2|  B2| C2b|  D2|     |  2|  A2|  D2|
|  2|  A2|  B2|  C2|  D2|     |  2|  A2|  D2|
+---+----+----+----+----+     +---+----+----+

另一方面,如果只有表a和表d直接连接而没有表b和表c,则结果将是

+---+----+----+
| id|colA|colD|
+---+----+----+
|  1|  A1|  D1|
|  2|  A2|  D2|
+---+----+----+

因此,即使最终结果不包含表b和表c中的任何列,如果您加入a->d或a->b->c->d,结果也不同。所以spark代码不能跳过表b和c的连接。
好消息是:如果按照a->b->c->d的方式从表b和c中排除列,spark将只处理表b和c的join列,并跳过(例如在shuffle期间)所有其他列。因此,当不从表b和表c中选择列时,处理的数据量至少会减少。

相关问题