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 在条件之间加入的主要内容,如果未能解决你的问题,请参考以下文章

HIVE/Impala 查询:计算满足特定条件的行之间的行数

Hive 上的非平等加入

日期明智的加入 Hive 问题

Hive:如果两个表之间满足条件,则查找唯一值

MySQL/ Hive:使用窗口或分析函数连接条件行

Hive 支持 Nonequi 加入?