我无法加入基于'之间的2个表格。在蜂巢中的条件。基本上因为Hive不支持这些联接,我不知道如何解决它。基本上,我想基于日期列连接两个表,其中t1.date< = t2.date和t1.date> = t2.tdate2。表中没有其他列匹配。我怎样才能做到这一点?h
答案 0 :(得分:0)
在我看来,首先在其中一个表上应用过滤和修改,然后应用join。
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。申请加入
的地方select t1.id, t2.id from temp t1 join new_temp t2 on (t1.id = t2.id) where t1.id < t2.id
=&GT;此查询将首先执行join,然后执行条件,因此输出中不会有行。 您可以通过执行以下命令来检查执行流程:
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;
这里连接已经应用,每次t1id和t2id都相等。
答案 1 :(得分:0)
这是一个古老的问题。我正在提供一种解决方法,因此它可能会对某人有所帮助。 我同意,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 |
+-------------+--------------+--+