我有两个可以通过公用密钥(即事务ID)连接的大型Hive表(数十亿条记录)。 table_a
包含所有交易ID,并且table_b
在一段时间内有交易。Hive低效嵌套连接
从理论上讲,应该是没有重复的事务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
然后通过内部将唯一事务子查询连接到原始表来过滤表。
最后,左外连接过滤的子查询。
有没有更有效的方法来编写这个(例如使用分析函数,如ROW_NUMBER() OVER ...
)?
你在'table_a'&'table_b'中有多少列? – gobrewers14
这两个表格都包含37列,主要是字符串。 –