【问题标题】:Join two tables using HiveQL使用 HiveQL 连接两个表
【发布时间】:2012-07-04 00:51:46
【问题描述】:

下面是两张表-

CREATE EXTERNAL TABLE IF NOT EXISTS Table1   (This is the MAIN table through which     comparisons need to be made) 
( 
ITEM_ID BIGINT, 
CREATED_TIME STRING, 
BUYER_ID BIGINT 
) 

CREATE EXTERNAL TABLE IF NOT EXISTS Table2 
( 
USER_ID BIGINT, 
PURCHASED_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>> 
) 

作为 BUYER_ID 和 USER_ID,它们都是同一个东西。

我需要通过比较表 1 来找到表 2 中不存在的总 COUNT 和所有那些 BUYER_ID。所以我认为这是一种左外连接查询。我是 HiveSql 的新手,所以我很难弄清楚在 HiveQL 中执行此操作的实际语法应该是什么。我写了下面的 SQL 查询。谁能告诉我下面的 SQL 查询是否可以实现我的场景?

SELECT COUNT(BUYER_ID), BUYER_ID 
FROM Table1 dw 
LEFT OUTER JOIN Table2 dps ON (dw.BUYER_ID = dps.USER_ID) 
GROUP BY BUYER_ID;

【问题讨论】:

  • USER_IDTable2 中是唯一的吗?

标签: sql hive


【解决方案1】:

如果我正确理解您的要求,我想您就快到了。如果两个表之间不匹配,您似乎只需要添加一个条件检查:

SELECT COUNT(BUYER_ID), BUYER_ID 
FROM Table1 dw 
LEFT OUTER JOIN Table2 dps ON (dw.BUYER_ID = dps.USER_ID) 
WHERE dps.USER_ID IS NULL
GROUP BY BUYER_ID;

上面将过滤掉在表 2 中匹配的 BUYER_ID,并显示剩余的 BUYER_ID 及其对应的计数值。 (嗯,这就是我理解你想要的。)

【讨论】:

  • 谢谢安德烈,但我无法理解这条线是什么意思? WHERE pds.USER_ID IS NULL
  • 左连接尝试匹配两个表的行,并从左侧返回所有行(即Table1)和只匹配行 i> 从连接的右侧 (Table2)。如果没有匹配,右侧的列将填充 NULL。这是应用WHERE 条件之前的中间结果。现在,该条件查看右侧的一列,即不可能包含 NULL如果有匹配项的列,并检查它是否为 NULL。如果它 NULL(意味着没有匹配),则返回相应的不匹配行(因此BUYER_ID)。
  • 然后将 GROUP BY 应用于 WHERE 条件后剩余的行。因此,您将获得在 Table2 中不匹配的 BUYER_ID,以及相应的 COUNT 值。
  • 感谢 Andriy 的详细描述。非常感谢。我被困在另一个与 HiveQL 相关的问题上。这就是问题。 http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive-using-hiveql。任何帮助将不胜感激。
  • 抱歉,这绝对不是我的专业领域。我只回答了这个问题,因为它被标记为 sql 并且您的查询在我看来是 SQL。但是直到大约 15 分钟前我读到它之后,我才对 HiveQL 一无所知,所以你可以想象我完全没有使用 HiveQL 的 ARRAY 或 STRUCT 的经验。再次抱歉,我很乐意提供帮助,但我不能。
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2018-07-12
  • 2018-12-04
相关资源
最近更新 更多