将表中的列与配置单元

时间:2018-05-17 12:37:15

标签: hive hiveql

我有两个hive表table1和table2。两个表中都没有共同的列。

表1:

------
| id |
------
| 22 |
| 11 |
| 56 |
| 15 |
------

表2:

-------------
| from | to |
-------------
|  10  | 20 |
|  21  | 35 |
|  40  | 60 |
-------------

必须在表格2中检查table1的id列,以确定它属于哪个范围'来自'和'到' table2。

预期产出:

------------------
| id | from | to |
------------------
| 22 |  21  | 35 |
| 11 |  10  | 20 |
| 56 |  40  | 60 |
| 15 |  10  | 20 |
------------------

尝试使用交叉连接和where条件并且能够获得所需的输出(但是想要避免交叉连接)。也尝试使用' exists'命令但在获取输出时遇到错误:

查询:

select id from table1 t1
where exists(select 1 from table2 t2
where t1.id between t2.from and t2.to) ;

但是错误为:subquery expression refers to both parent and subquery expressions and is not a valid join condition

任何建议最早都会有所帮助。

由于

2 个答案:

答案 0 :(得分:1)

以下是逐步说明以获得所需结果:

hive> create table table1(id int);
hive> create table table2(from_ int, to_ int);
hive> select * from table1;
OK
22
11
56
15

hive> select * from table2;
OK
10  20
21  35
40  60

您的SQL应如下所示,以获得所需的结果:

select id,from_,to_
from table1 t1
left join table2 t2 on(t1.id between t2.from_ and t2.to_);

Output:
id      from_   to_
22      21      35
11      10      20
56      40      60
15      10      20

答案 1 :(得分:0)

支持ON子句中的复杂表达式,从Hive 2.2.0开始(参见HIVE-15211HIVE-15251)。在此之前,Hive不支持不是平等条件的连接条件。

因此,Hive中的唯一解决方案< 2.2.0似乎适用CROSS JOIN +过滤器