hive 各种join使用实例


hive (test)> CREATE TABLE tmp_a(
           > aID int, 
           > aNum String 
           > ) ;
hive (test)> CREATE TABLE tmp_b( 
           > bID int, 
           > bName String 

           > ) ;


1. (cross可省略)cross join 可以不加连接条件 

hive (test)> select * from tmp_a a  join tmp_b b  ;
 
a.aid   a.anum  b.bid   b.bname
1       a20050111       1       2006032401
2       a20050112       1       2006032401
3       a20050113       1       2006032401
4       a20050114       1       2006032401
5       a20050115       1       2006032401
1       a20050111       2       2006032402
2       a20050112       2       2006032402
3       a20050113       2       2006032402
4       a20050114       2       2006032402
5       a20050115       2       2006032402
1       a20050111       3       2006032403
2       a20050112       3       2006032403
3       a20050113       3       2006032403
4       a20050114       3       2006032403
5       a20050115       3       2006032403
1       a20050111       4       2006032404
2       a20050112       4       2006032404
3       a20050113       4       2006032404
4       a20050114       4       2006032404
5       a20050115       4       2006032404
1       a20050111       8       2006032408
2       a20050112       8       2006032408
3       a20050113       8       2006032408
4       a20050114       8       2006032408
5       a20050115       8       2006032408
Time taken: 15.056 seconds, Fetched: 25 row(s)


2.join on 条件

select * from tmp_a a  join tmp_b b on a.aid =b.bid  ;

a.aid   a.anum  b.bid   b.bname
1       a20050111       1       2006032401
2       a20050112       2       2006032402
3       a20050113       3       2006032403

4       a20050114       4       2006032404

Time taken: 14.459 seconds, Fetched: 4 row(s)

可见join on 是join的子集

join的时候没有连接条件的时候结果集是最大的 ,所以Hive中Join的关联键必须在ON()中指定,不能在Where中指定,否则就会先做笛卡尔积,再过滤 ,此外如果join的时候有非等值连接的时候可以刚在where的条件中进行过滤,减少结果集 。


3. full (outer   可以省略) join 

select * from tmp_a a full outer  join tmp_b b on a.aid =b.bid  ;

a.aid   a.anum  b.bid   b.bname
1       a20050111       1       2006032401
2       a20050112       2       2006032402
3       a20050113       3       2006032403
4       a20050114       4       2006032404
5       a20050115       NULL    NULL
NULL    NULL    8       2006032408

4. select * from tmp_a a left  join tmp_b b on a.aid =b.bid  ;

a.aid   a.anum  b.bid   b.bname
1       a20050111       1       2006032401
2       a20050112       2       2006032402
3       a20050113       3       2006032403
4       a20050114       4       2006032404
5       a20050115       NULL    NULL

Time taken: 12.028 seconds, Fetched: 5 row(s)

left join 保留所有左边的记录,连接条件的不成立的就用NULL补全,而且是full outer join的子集

同理right join也是,只是右边的表结果全被保留 。


5. left semi join

select * from tmp_a a left semi join tmp_b b on a.aid =b.bid  ;

a.aid   a.anum
1       a20050111
2       a20050112
3       a20050113
4       a20050114
Time taken: 16.078 seconds, Fetched: 4 row(s)

等同于 下面的条件 

 select a.aid ,a.anum from tmp_a a left join tmp_b b on a.aid =b.bid  where b.bid is not null  ;

a.aid   a.anum
1       a20050111
2       a20050112
3       a20050113
4       a20050114
Time taken: 10.473 seconds, Fetched: 4 row(s)




Hive 中的 RECURSIVE 可以用来处理递归查询。以下是一个简单的例子: 假设你有一个员工表格 employee,其中包含员工的 ID,姓名,上级 ID,薪资等信息。你想要查询某个员工及其所有下属的薪资总和,可以使用递归查询来实现。 首先,你需要创建一个临时表格来存储递归查询的结果: ``` CREATE TEMPORARY TABLE employee_temp ( id INT, name STRING, salary INT, manager_id INT ); ``` 然后,你需要将员工表格 employee 中的数据插入到这个临时表格中: ``` INSERT INTO employee_temp SELECT * FROM employee; ``` 接下来,你可以使用 RECURSIVE 关键字来执行递归查询,并使用 WITH 子句来定义递归查询的初始条件和递归条件: ``` WITH RECURSIVE subordinates AS ( SELECT id, name, salary, manager_id FROM employee_temp WHERE id = 1 -- 初始条件:查询 ID 为 1 的员工及其下属 UNION ALL SELECT e.id, e.name, e.salary, e.manager_id FROM employee_temp e JOIN subordinates s ON s.id = e.manager_id -- 递归条件:查询下属员工 ) SELECT SUM(salary) FROM subordinates; -- 计算薪资总和 ``` 在这个例子中,我们首先定义了一个名为 subordinates 的递归查询,其中初始条件是查询 ID 为 1 的员工及其下属,递归条件是查询下属员工。然后,我们从 subordinates 查询结果中计算薪资总和。注意,递归查询必须包含 UNION ALL 子句,而不是 UNION 子句,因为后者会自动去重,而在递归查询中这是不希望的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mtj66

看心情

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值