[一起学Hive]之九-Hive的查询语句SELECT

八、Hive的查询语句SELECT

在所有的数据库系统中,SELECT语句是使用最多,也最复杂的一块,Hive中的查询语句SELECT支持的语法当然也比较复杂,本文只能尽力去介绍。

8.1 基础查询语法

Hive中的SELECT基础语法和标准SQL语法基本一致,支持WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING、LIMIT、子查询等;
语法如下:

 
 
  1. [WITH CommonTableExpression (, CommonTableExpression)*]
  2. SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  3. FROM table_reference
  4. [WHERE where_condition]
  5. [GROUP BY col_list]
  6. [CLUSTER BY col_list
  7. | [DISTRIBUTE BY col_list] [SORT BY col_list]
  8. ]
  9. [LIMIT number]

下面介绍Hive中比较特殊的一些查询语法。

8.2 ORDER BY和SORT BY

ORDER BY用于全局排序,就是对指定的所有排序键进行全局排序,使用ORDER BY的查询语句,最后会用一个Reduce Task来完成全局排序。
SORT BY用于分区内排序,即每个Reduce任务内排序。
看下面的例子:
原表数据为:

 
 
  1. hive> select * from lxw1234_com;
  2. OK
  3. 5
  4. 3
  5. 6
  6. 2
  7. 9
  8. 8
  9. 1
  10.  

使用ORDER BY

 
 
  1. hive> select * from lxw1234_com order by id;
  2. 1
  3. 2
  4. 3
  5. 5
  6. 6
  7. 8
  8. 9
  9.  

使用SORT BY

hive> set mapred.reduce.tasks=2;
hive> select * from lxw1234_com sort by id;
2
5
6
9
1
3
8

设定了2个reduce,从结果可以看出,每个reduce内做了排序。
如果reduce数为1,那么ORDER BY和SORT BY的结果是一样的:

 
 
  1. hive> set mapred.reduce.tasks=1;
  2. hive> select * from lxw1234_com sort by id;
  3. 1
  4. 2
  5. 3
  6. 5
  7. 6
  8. 8
  9. 9
  10.  

真实业务环境中,我们的需求大多需要使用ORDER BY全局排序来完成。

8.3 DISTRIBUTE BY和CLUSTER BY

distribute by:按照指定的字段或表达式对数据进行划分,输出到对应的Reduce或者文件中。
cluster by:除了兼具distribute by的功能,还兼具sort by的排序功能。

##distribute by

 
 
  1. hive> set mapred.reduce.tasks=2;
  2. hive>INSERT overwrite LOCAL directory '/tmp/lxw1234/'
  3. SELECT id FROM lxw1234_com
  4. distribute BY id;

执行后在本地的/tmp/lxw1234目录中生成了000000_0和000001_0两个文件:
cat 000000_0
8
2
6
cat 000001_0 ##id%2=1的记录
1
9
3
5

##cluster by

 
 
  1. hive> set mapred.reduce.tasks=2;
  2. hive> INSERT overwrite LOCAL directory '/tmp/lxw1234/'
  3. SELECT id FROM lxw1234_com
  4. CLUSTER BY id;
  5. cat 000000_0
  6. 2
  7. 6
  8. 8
  9. cat 000001_0
  10. 1
  11. 3
  12. 5
  13. 9

注意:使用cluster by之后,每个文件中的id都进行了排序,而distribute by没有。

8.4 子查询

子查询和标准SQL中的子查询语法和用法基本一致,需要注意的是,Hive中如果是从一个子查询进行SELECT查询,那么子查询必须设置一个别名。

 
 
  1. SELECT col
  2. FROM (
  3. SELECT a+b AS col
  4. FROM t1
  5. ) t2

另外,从Hive0.13开始,在WHERE子句中也支持子查询,比如:

 
 
  1. SELECT *
  2. FROM A
  3. WHERE A.a IN (SELECT foo FROM B);
  4.  
  5. SELECT A
  6. FROM T1
  7. WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y)

还有一种将子查询作为一个表的语法,叫做Common Table Expression(CTE):

 
 
  1. with q1 as (select * from src where key= '5'),
  2. q2 as (select * from src s2 where key = '4')
  3. select * from q1 union all select * from q2;
  4.  
  5. with q1 as ( select key, value from src where key = '5')
  6. from q1
  7. insert overwrite table s1
  8. select *;

8.5 虚拟列

Hive查询中有两个虚拟列:
INPUT__FILE__NAME:数据对应的HDFS文件名;
BLOCK__OFFSET__INSIDE__FILE:该行记录在文件中的偏移量;

 
 
  1. hive> select id,INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE from lxw1234_com;
  2. 5 hdfs://cdh5/tmp/lxw1234/1.txt 0
  3. 3 hdfs://cdh5/tmp/lxw1234/1.txt 2
  4. 6 hdfs://cdh5/tmp/lxw1234/1.txt 4
  5. 2 hdfs://cdh5/tmp/lxw1234/1.txt 6
  6. 9 hdfs://cdh5/tmp/lxw1234/1.txt 8
  7. 8 hdfs://cdh5/tmp/lxw1234/1.txt 10
  8. 1 hdfs://cdh5/tmp/lxw1234/1.txt 12

Hive查询中还包括:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值