为什么Hive中的group by后面不能使用字段别名?
为什么Hive中的group by后面不能使用字段别名呢?看了这篇文章你将一目了然。
文章目录
- 1. 案例说明
- 2. 分析原因
- 3. 解决办法
- 4. 执行效率
- 5. 总结
1. 案例说明
我们以一个例子来说明。
(1)数据
创建business.txt,内容如下:
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
(2)创建表
create table business(
name string,
orderdate string,
cost int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
(3)导入数据
load data local inpath "data/business.txt" into table
business;
(4)查找每月购物的人次
使用字段别名报错:
select substring(orderdate,1,length(orderdate)-3) month_value, count(name)
from business
group by month_value;
报错如下:
FAILED: SemanticException [Error 10004]: Line 3:9 Invalid table alias or column reference 'month_value': (possible column names are: name, orderdate, cost)
不使用字段别名可以正常运行:
select substring(orderdate,1,length(orderdate)-3) month_value, count(name)
from business
group by substring(orderdate,1,length(orderdate)-3);
查询结果为:
month_value _c1
2017-01 6
2017-02 1
2017-04 5
2017-05 1
2017-06 1
2. 分析原因
为了什么使用别名会报错呢?因为Sql语句执行顺序为:
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
从上述sql的执行顺序可以看出,Group by之所以不能使用字段别名,是因为当执行到第五步GROUP BY
时,第七步的SELECT
还没有执行。由于ORDER BY
在SELECT
后面,所以可以使用字段别名。
另外,FROM
语句是第一步执行的,故所有的关键字都可以使用表别名,这个一定要注意。
3. 解决办法
我们可以通过子查询的方式解决group by
语句不能使用别名的问题,例如查找每月购物的人次,可以通过下列sql语句:
select
tmp.month_value,count(tmp.name)
from (
select substring(orderdate,1,length(orderdate)-3) month_value,name from business
) tmp
group by tmp.month_value;
由于最先执行的是最外层from后面的语句,所以group by
可以使用子查询里面的字段别名。
4. 执行效率
分析下列sql
### 第一个sql
select substring(orderdate,1,length(orderdate)-3) month_value, count(name)
from business
group by substring(orderdate,1,length(orderdate)-3);
我们可以看到,下列sql语句有两个substring(orderdate,1,length(orderdate)-3)
,这是不是代表该语句中的方法执行了两次呢?其实并不是,Hive里面经过了优化,这样写并不会增加运行耗时。
这个结论我是参考网友的结论,可能不太准确,我从运行时间上做了一个简单的验证
### 第二个sql
select count(name)
from business
group by substring(orderdate,1,length(orderdate)-3);
上面两个sql语句:
- 第一个sql运行时间:
1mins, 10sec
- 第二个sql运行时间:
1mins, 6sec
可以看到,并没有增加多少运行时间。
5. 总结
所有的关键字后面都可以用表的别名,而字段的别名根据sql的执行顺序来判断。
但是,在mysql中:
group by
中可以使用字段别名- where中不能使用别名
order by
中可以使用别名
mysql特殊是因为mysql中对查询做了加强。其余像oracle、hive中别名的使用都是严格遵循sql执行顺序的。
【参考资料】
https://www.cnblogs.com/aspirant/p/12626203.html
为什么Hive中的group by后面不能使用字段别名?相关推荐
- Linq中的group by多表多字段,Sum求和
Linq中的group by多表多字段,Sum求和 //Line to Sql 写法var data = (from a in Itemsgroup a by new { a.GroupId, a.I ...
- Linq中的group by多表多字段
按我的理解,linq与sql对应,只不过,一个对应在代码里,一个对应在数据库里.之所以要使用linq,是让分工越来越精细的程序员可以基本不管数据库这一块,只须关注代码即可. 不过,linq与sql还是 ...
- Hive中的常用函数
一.Hive中collect_list和collect_set的区别 二.Hive中四种排序(order by.sort by.distribute by.cluster by) 2.1 order ...
- mysql count order by_【数据库】mysql中count(), group by, order by使用方法分享
本文主要和大家分享mysql中count(), group by, order by使用方法,mysql中order by 排序查询.asc升序.desc降序,group by 分组查询.having ...
- hive hsq中的group by Distribute by partition by cluster by partitioned by clustered by
https://blog.csdn.net/qq_16320025/article/details/102976995 https://segmentfault.com/a/1190000021887 ...
- HIVE中的表以及语法
2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...
- hive中如何控制mapper的数量
参考文档:https://www.cnblogs.com/1130136248wlxk/articles/5352154.html 1. 决定map的数据的决定因素有: input的文件总个数,inp ...
- 061 hive中的三种join与数据倾斜
一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...
- Hive中的一种假NULL
Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a string Timetaken: ...
最新文章
- 配置开发ExtJS环境
- Visual Studio警告IDE0006的解决办法
- UVa11427 Expect the Expected
- Python读取excel文件可读取xlsx格式和xls格式可直接读取超链接,读出为字典格式(列表套字典),处理合并单元格的问题
- 洛谷 P3368 【模板】树状数组 2(线段树区间加单点查找)
- 【Android Studio安装部署系列】十三、Android studio添加和删除Module 2
- 承博士:让云计算落地生根的中国云计算平台
- hdu 2476 区间dp
- spring Boot环境下dubbo+zookeeper的一个基础讲解与示例
- Centos6.5 安装配置 Apache +mysql +php 操作文档
- 企业应该了解的ISO27001体系建设指导
- DOS那一代的程序员现在都干嘛呢?
- Cisco 计算机网络课程设计 某校园网设计
- 两部手机怎样才能把数据都传过来_两个手机如何互传照片、文件 ,教你四大绝招...
- win10系统重装教程
- 鸿蒙操作系统pc,不负期待!鸿蒙操作系统将于6月2日正式发布,你的手机更新了吗?...
- Anaconda3 安装失败 failed to create menus
- Solidity ——push mapping 探赜索隐
- Windows中怎么下载桌面便签小工具 便签小工具简单使用教程
- 香港城大:首创3D打印磁控微型机器人技术,推动人体送药研究发展