Hive加入条件之间

时间:2017-11-14 00:05:15

标签: hive hql hiveql

我无法加入基于'之间的2个表格。在蜂巢中的条件。基本上因为Hive不支持这些联接,我不知道如何解决它。基本上,我想基于日期列连接两个表,其中t1.date< = t2.date和t1.date> = t2.tdate2。表中没有其他列匹配。我怎样才能做到这一点?h

2 个答案:

答案 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         |
+-------------+--------------+--+