hive 完全连接的工作方式与内部连接类似-它具有多个连接条件(不包括where子句)

roejwanj  于 2022-11-23  发布在  Hive
关注(0)|答案(1)|浏览(98)

我正在尝试对两个表执行完全联接,如下所示。我对完全联接的预期是,不在table 1中的任何数据组合都将从table 2中拉入,但当我运行此查询时,table 2中的一些行将被删除,其行为类似于内部联接。
关于这一点的一些细节是,category 1、category 2和category 3本质上是当我缺少关于一个组的元数据时,因此只是手动硬编码为“未知”。
我做了一些挖掘,表2中缺少的行是写着“未知”的行,我不知道这有什么相关性,因为category 1和category 2的实际值也只是文本字符串,所以我的想法是它应该将“未知”视为任何其他文本字符串,并使用完全连接从表2中引入行。
到目前为止,我所搜索的所有解决方案都是因为where子句迫使它们像内连接一样工作。这里的任何指针都将是有用的!
最后,我使用Spark上的Hive来查询是否有帮助。

SELECT a.date AS date,
       a.group AS group,
       a.category1,
       a.category2,
       a.category3,
       COALESCE(a.metric1,0) AS signups,
       COALESCE(b.metric2,0) AS gnc 
FROM table1 a
FULL JOIN table2 b 
       ON a.date = b.date
      AND a.group= b.group
      AND LOWER(a.category1) = LOWER(b.category1)
      AND LOWER(a.category2) = LOWER(b.category2)
      AND LOWER(a.category3) = LOWER(b.category3)

表大致如下所示

Table 1 

Date         Group Category1 Category2 Category3 Metric1
1/1/2001       B      ABC        DEF     GHI       1  
......
12/11/2022     A      XYZ        DEF     GHI       2

Table 2

Date         Group Category1 Category2 Category3 Metric2

1/1/2001       B      ABC        DEF     GHI       5  
......
12/11/2022     A    Unknown    Unknown  Unknown    3
zengzsys

zengzsys1#

仍然不确定连接发生了什么,但基本上完全连接是作为一个内部连接,我最好的猜测是由于数据设置,连接条件的行为就像一个去因子where子句,并从正确的表过滤出行,因为我没有一个实际的where子句,我没有选择将它们移动到任何地方。
我寻找了完全连接的替代方法,并对我的两个表进行了联合,然后对现在联合的表进行了分组。Turns out您几乎永远不需要完全连接,这是一个很好的参考资料。
注意:在我的例子中,表1和表2都被清理了,空值也被清理了,并且被预聚合了。

With agg AS (

SELECT group,
       category1,
       category2,
       category3,
       metric1,
       0 AS metric2
  FROM table1

UNION 

SELECT group,
       category1,
       category2,
       category3,
       0 AS metric1,
       metric2
  FROM table2 ) 

SELECT group,
       category1,
       category2,
       category3,
       SUM(metric1) AS metric1,
       SUM(metric2) AS metric2
  FROM table2
GROUP BY 1,2,3,4

相关问题