为什么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 BYSELECT后面,所以可以使用字段别名。

另外,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中:

  1. group by中可以使用字段别名
  2. where中不能使用别名
  3. order by中可以使用别名

mysql特殊是因为mysql中对查询做了加强。其余像oracle、hive中别名的使用都是严格遵循sql执行顺序的

【参考资料】

https://www.cnblogs.com/aspirant/p/12626203.html

为什么Hive中的group by后面不能使用字段别名?相关推荐

  1. Linq中的group by多表多字段,Sum求和

    Linq中的group by多表多字段,Sum求和 //Line to Sql 写法var data = (from a in Itemsgroup a by new { a.GroupId, a.I ...

  2. Linq中的group by多表多字段

    按我的理解,linq与sql对应,只不过,一个对应在代码里,一个对应在数据库里.之所以要使用linq,是让分工越来越精细的程序员可以基本不管数据库这一块,只须关注代码即可. 不过,linq与sql还是 ...

  3. Hive中的常用函数

    一.Hive中collect_list和collect_set的区别 二.Hive中四种排序(order by.sort by.distribute by.cluster by) 2.1 order ...

  4. mysql count order by_【数据库】mysql中count(), group by, order by使用方法分享

    本文主要和大家分享mysql中count(), group by, order by使用方法,mysql中order by 排序查询.asc升序.desc降序,group by 分组查询.having ...

  5. 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 ...

  6. HIVE中的表以及语法

    2019独角兽企业重金招聘Python工程师标准>>> HIVE中的表以及语法 一.HIVE的表 HIVE使用的功能性的表格分为四种:内部表.外部表.分区表.分桶表. 1.内部表.外 ...

  7. hive中如何控制mapper的数量

    参考文档:https://www.cnblogs.com/1130136248wlxk/articles/5352154.html 1. 决定map的数据的决定因素有: input的文件总个数,inp ...

  8. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  9. Hive中的一种假NULL

    Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a      string Timetaken: ...

最新文章

  1. 配置开发ExtJS环境
  2. Visual Studio警告IDE0006的解决办法
  3. UVa11427 Expect the Expected
  4. Python读取excel文件可读取xlsx格式和xls格式可直接读取超链接,读出为字典格式(列表套字典),处理合并单元格的问题
  5. 洛谷 P3368 【模板】树状数组 2(线段树区间加单点查找)
  6. 【Android Studio安装部署系列】十三、Android studio添加和删除Module 2
  7. 承博士:让云计算落地生根的中国云计算平台
  8. hdu 2476 区间dp
  9. spring Boot环境下dubbo+zookeeper的一个基础讲解与示例
  10. Centos6.5 安装配置 Apache +mysql +php 操作文档
  11. 企业应该了解的ISO27001体系建设指导
  12. DOS那一代的程序员现在都干嘛呢?
  13. Cisco 计算机网络课程设计 某校园网设计
  14. 两部手机怎样才能把数据都传过来_两个手机如何互传照片、文件 ,教你四大绝招...
  15. win10系统重装教程
  16. 鸿蒙操作系统pc,不负期待!鸿蒙操作系统将于6月2日正式发布,你的手机更新了吗?...
  17. Anaconda3 安装失败 failed to create menus
  18. Solidity ——push mapping 探赜索隐
  19. Windows中怎么下载桌面便签小工具 便签小工具简单使用教程
  20. 香港城大:首创3D打印磁控微型机器人技术,推动人体送药研究发展

热门文章

  1. MatLab建模学习笔记3——MatLab工具箱
  2. 2013年10月高等教育国际金融全国统一命题考试
  3. 坚持正确的研发项目管理转型之路
  4. SCL语言中如何进行网络编程?
  5. 第二部分 单机以及编队控制实验—初级教程(4)
  6. 微信网页ios端不能滚动
  7. Lidar360 基本操作
  8. 中午小睡片刻 有益身体健康
  9. 29岁才转行软件测试,目前31了,我的一些经历跟感受
  10. APS in Linux for Lenovo R61i