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