Hive之数据查询

Hive之数据查询

一,排序和聚合
对于排序有两种方式,一种是order by 一种是sort by
order by 会对所有的数据进行排序,所以最后会只有一个reducer来处理,如果数据量非常大,效率会非常差劲
sort by是部分排序,只是对一个reducer的数据进行排序

FROM records2
SELECT year, temperature
DISTRIBUTE BY year
SORT BY year ASC, temperature DESC;
1949 111
1949 78
1950 22
1950 0
1950 -11


关键字DISTRIBUTE主要是控制特定的行会分发到同一个reducer里面去处理,这样后面再进行聚合操作就很方便。

二,连接查询

hive> SELECT * FROM sales; -- name 购买者的名字,id购买的商品id
Joe 2
Hank 4 
Ali 0
Eve 3
Hank 2
hive> SELECT * FROM things; --name 商品名称 id 商品id
2 Tie
4 Coat
3 Hat
1 Scarf


1,内连接

hive> SELECT sales.*, things.*
> FROM sales JOIN things ON (sales.id = things.id);


Screenshot from 2013-10-11 19:01:53

SELECT sales.*, things.*
FROM sales, things
WHERE sales.id = things.id;


需要注意的是对于MySQL和Oracel里面常用的等值连接方式,hive是不支持的。

2,外连接

hive> SELECT sales.*, things.*
> FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);
 
Ali    0   NULL  NULL
Joe    2   2    Tie
Hank   2   2    Tie
Eve    3   3    Hat
Hank   4   4    Coat
 
hive> SELECT sales.*, things.*
> FROM sales RIGHT OUTER JOIN things ON (sales.id = things.id);
 
NULL  NULL 1    Scarf
Joe    2   2    Tie
Hank   2   2    Tie
Eve    3   3    Hat
Hank   4   4    Coat
 
hive> SELECT sales.*, things.*
> FROM sales FULL OUTER JOIN things ON (sales.id = things.id);
 
Ali    0   NULL  NULL
NULL  NULL 1    Scarf
Joe    2   2    Tie
Hank   2   2    Tie
Eve    3   3    Hat
Hank   4   4    Coat


3,Semi joins

先来看一个查询:

SELECT *
FROM things
WHERE things.id IN (SELECT id from sales);
 
注意:hive不支持这种在in中使用子查询的语法,但是下面的查询是同样的意思
hive> SELECT *
> FROM things LEFT SEMI JOIN sales ON (sales.id = things.id);


但是使用SEMI JOIN有一定的限制,就是右边的表不允许出现在select中只能出现在on从句中

4,子查询
对于子查询hive有一些限制,只能在from里面使用子查询
例如:
select total from
(select c1+c2 as total from table) my_sub_query;
子查询必须指定一个名字


posted @ 2014-09-27 18:37  JamesFan  阅读(484)  评论(0编辑  收藏  举报