一 排序和聚合
对于排序有两种方式,一种是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;
子查询必须指定一个名字