最近在使用hive进行数据处理
因为hive使用的语句sql语句与mysql中基本类似
但是还有很多不同的小点,也就是坑,需要注意
sql语句的执行顺序
在mysql中,sql语句的执行顺序是这样的
from where group by hiving order by select limit
这个顺序有什么意义呢?
要知道,在mysql的早期版本时,hiving中是无法使用select中的别名的
但是在mysql的新版本中,hiving中是可以使用select中的别名的
这就会对很多人产生误导
说好的hiving中不能使用别名,你却偷偷翻了墙,把别名偷过来使用了
注意,此时hiving中使用别名,是因为mysql中的一个属性的设置
这个属性具体是什么有兴趣的可以去查一下
当这个属性设置为false时,hiving中就无法使用别名
那么,hive中的sql语句中的hiving就无法使用select中的别名吧
错了!
在hive中,sql语句的执行顺序是完全不通的,这一特点,可以通过hive的执行计划
看到sql语句的执行顺序,当然,可能有些不明显
hive (db_practise)> explain
> select deptno
> from tb_emp
> group by deptno;
OK
Explain
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: tb_emp
Statistics: Num rows: 164 Data size: 656 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: deptno (type: int)
outputColumnNames: deptno
Statistics: Num rows: 164 Data size: 656 Basic stats: COMPLETE Column stats: NONE
Group By Operator
keys: deptno (type: int)
mode: hash
outputColumnNames: _col0
Statistics: Num rows: 164 Data size: 656 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
key expressions: _col0 (type: int)
sort order: +
Map-reduce partition columns: _col0 (type: int)
Statistics: Num rows: 164 Data size: 656 Basic stats: COMPLETE Column stats: NONE
Reduce Operator Tree:
Group By Operator
keys: KEY._col0 (type: int)
mode: mergepartial
outputColumnNames: _col0
Statistics: Num rows: 82 Data size: 328 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: false
Statistics: Num rows: 82 Data size: 328 Basic stats: COMPLETE Column stats: NONE
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink
其实,在hive中,sql的执行顺序是如下的
from... where.... select...group by... having ... order by...limit
所以:在hive中的hiving中,是可以使用别名的,这点要注意
聚合函数使用注意事项
我在使用聚合函数时,遇到了如下的问题,经查找后,发现有位前辈总结的非常好,所以来借鉴一下
1.聚合条件--HAVING,从Hive0.7.0开始HAVING被添加到Hive作为GROUP BY结果集的条件过滤。HAVING可以作为子句的替代。
hive> SELECT sex_age.age FROM employee GROUP BY sex_age.age HAVING count(*) >=1;
2.聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。换句话说使用聚合函数时,一个列字段要不在group by里,要不必须在聚合函数里面,不能单独出现,否则报错。
1.只有聚合函数,没有group by ,没问题
hive (default)> select sum(a),count(distinct b) from fdm_sor.tmp_aaaaa;
OK
2 1
2.有聚合函数,又有别的列c,但是没有用group by,报错
hive (default)> select sum(a),count(distinct b) ,c from fdm_sor.tmp_aaaaa;
FAILED: SemanticException [Error 10025]: Line 1:33 Expression not in GROUP BY key 'c'
3.聚合函数配合group by 一起使用
select sum(a),count(distinct b) , c from fdm_sor.tmp_aaaaa group by c;
OK
2 1 2019-05-22 21:23:34
原文:https://blog.csdn.net/qq_26442553/article/details/79465266