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);
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;
子查询必须指定一个名字