Hive 配置单元无效嵌套联接
我有两个大型配置单元表(数十亿条记录),它们可以通过一个公共键(即事务ID)连接起来<代码>表a包含所有事务ID,而Hive 配置单元无效嵌套联接,hive,Hive,我有两个大型配置单元表(数十亿条记录),它们可以通过一个公共键(即事务ID)连接起来表a包含所有事务ID,而表b在某些时间内有事务 理论上,两个表中都不应该有重复的事务ID。实际上,有一些重复项,虽然它们的数量相对较少,但“多:多”连接可能会导致问题。我正在基于这些数据构建一个模型,作为第一步,可能更容易忽略所有具有重复事务ID的记录 我写了一个丑陋的蜂巢查询,虽然它在逻辑上做了它需要做的事情,但效率非常低: SELECT table_a.someCol, table_b.anot
表b
在某些时间内有事务
理论上,两个表中都不应该有重复的事务ID。实际上,有一些重复项,虽然它们的数量相对较少,但“多:多”连接可能会导致问题。我正在基于这些数据构建一个模型,作为第一步,可能更容易忽略所有具有重复事务ID的记录
我写了一个丑陋的蜂巢查询,虽然它在逻辑上做了它需要做的事情,但效率非常低:
SELECT
table_a.someCol,
table_b.anotherCol,
[etc...]
FROM
(SELECT
table_a.*
FROM table_a
INNER JOIN
(SELECT
transaction_id
FROM table_a
GROUP BY transaction_id
HAVING COUNT(*) = 1) unique_transaction_ids
ON table_a.transaction_id = unique_transaction_ids.transaction_id) table_a_unique_transaction_ids_only
LEFT OUTER JOIN
(SELECT
table_b.*
FROM table_b
INNER JOIN
(SELECT
transaction_id
FROM table_b
GROUP BY transaction_id
HAVING COUNT(*) = 1) unique_transaction_ids
ON table_b.transaction_id = unique_transaction_ids.transaction_id) table_b_unique_transaction_ids_only
ON table_a_unique_transaction_ids_only.transaction_id = table_b_unique_transaction_ids_only.transaction_id;
工作原理:
首先,对于这两个表,创建只出现一次的事务ID列表:
SELECT
transaction_id
FROM table_?
GROUP BY transaction_id
HAVING COUNT(*) = 1
然后通过将唯一的事务子查询与原始表进行内部联接来过滤表
最后,左外连接已过滤的子查询
是否有一种更有效的方法来编写此代码(例如,使用分析函数,例如,
行数()超过…
)?如果您想将表a
和表b
结合在一起,则左外连接似乎是不可避免的。这两个自联接是可以避免的。由于您需要只发生过一次的事务id
,因此可以对其余列执行MAX()
或MIN()
,而不会丢失信息(即使它们不是数字列)。差不多
select transaction_id
, max(col1) col1
, max(col2) col2
.
.
.
, max(coln) coln
from table_a
group by transaction_id
having count(transaction_id) = 1
这是一种将列“拉过”到下一个“级别”的方法,而不必按它们分组。如果你有很多列,写起来可能会很枯燥,但为了避免两个自连接通常是值得的。在表a
和表b
中有多少列?两个表都包含37列,主要是字符串。