1. 程式人生 > >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;
子查詢必須指定一個名字