Hive 配置单元无效嵌套联接

Hive 配置单元无效嵌套联接,hive,Hive,我有两个大型配置单元表(数十亿条记录),它们可以通过一个公共键(即事务ID)连接起来表a包含所有事务ID,而表b在某些时间内有事务 理论上,两个表中都不应该有重复的事务ID。实际上,有一些重复项,虽然它们的数量相对较少,但“多:多”连接可能会导致问题。我正在基于这些数据构建一个模型,作为第一步,可能更容易忽略所有具有重复事务ID的记录 我写了一个丑陋的蜂巢查询,虽然它在逻辑上做了它需要做的事情,但效率非常低: SELECT table_a.someCol, table_b.anot

我有两个大型配置单元表(数十亿条记录),它们可以通过一个公共键(即事务ID)连接起来<代码>表a包含所有事务ID,而
表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列,主要是字符串。