Hive之資料查詢
阿新 • • 發佈:2019-01-22
一,排序和聚合
對於排序有兩種方式,一種是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;
子查詢必須指定一個名字