Hive 在条件之间加入
Posted
技术标签:
【中文标题】Hive 在条件之间加入【英文标题】:Hive joining on between condition 【发布时间】:2017-11-14 00:05:15 【问题描述】:我无法根据 Hive 中的“介于”条件连接 2 个表。基本上因为 Hive 不支持这些连接,我不知道如何解决它。基本上,我想根据 t1.date=t2.tdate2 的日期列加入两个表。表中没有其他列匹配。我怎样才能做到这一点?h
【问题讨论】:
为此,您需要两个表中的一个公共键,然后您可以加入该表,然后应用此条件。 【参考方案1】:在我看来,首先在其中一个表上应用过滤和修改,然后应用连接。
select t.id, new.id from (select t1.id from temp t1, new_temp t2 where t1.id > t2.id)t join new_temp new on (t.id = new.id);
这应该可行。我已经用我想到的测试用例进行了测试。
以下是您可能想到但行不通的其他方法。
1.应用 where with join
select t1.id, t2.id from temp t1 join new_temp t2 on (t1.id = t2.id) where t1.id < t2.id
=> 此查询将先执行连接,然后执行条件,因此输出中不会有行。 您可以通过执行来检查执行流程:
explain select t1.id, t2.id from temp t1 join new_temp t2 on (t1.id = t2.id) where t1.id < t2.id;
2。加入后在哪里申请
select * from (select t1.id as t1id, t2.id as t2id from temp t1 join new_temp t2 on (t1.id = t2.id))new_table where t1id < t2id;
这里已经应用了join,每次t1id和t2id都相等。
【讨论】:
【参考方案2】:这是一个老问题。我正在提供一种解决方法,所以它可能会对某人有所帮助。 我同意,BETWEEN、 运算符在 Impala 的 JOIN 子句中工作。但目前不要在 Hive 中工作。
我有一个解决方法。我知道这不是一种有效的方法,但它确实有效。它基于逻辑,将(日期)范围之间的元素展开,并用于连接两个表。
WITH
date_range AS (
SELECT 'dt1' AS date_code, '2020-01-01' AS start_dt, '2020-01-31' AS end_dt
UNION ALL
SELECT 'dt2' AS date_code, '2020-02-01' AS start_dt, '2020-02-29' AS end_dt
UNION ALL
SELECT 'dt3' AS date_code, '2020-03-01' AS start_dt, '2020-03-31' AS end_dt
)
,dates_breakup AS (
SELECT distinct date_code, date_add(rd.start_dt, dts.days) as active_dt
FROM date_range rd LATERAL VIEW posexplode(split(space(datediff(rd.end_dt,rd.start_dt)),' ')) dts as days, x
),my_data AS (
SELECT '2020-01-15' AS txn_dt
UNION ALL
SELECT '2020-02-10' AS txn_dt
UNION ALL
SELECT '2020-05-12' AS txn_dt
)
SELECT a.txn_dt, b.date_code
FROM my_data a
LEFT JOIN dates_breakup b ON b.active_dt=a.txn_dt
;
输出:
+-------------+--------------+--+
| a.txn_dt | b.date_code |
+-------------+--------------+--+
| 2020-01-15 | dt1 |
| 2020-02-10 | dt2 |
| 2020-05-12 | NULL |
+-------------+--------------+--+
【讨论】:
以上是关于Hive 在条件之间加入的主要内容,如果未能解决你的问题,请参考以下文章