Hive第六天——Hive函数(GROUP BY语句、HAVING语句、ORDER BY语句)

本文详细介绍了Hive中的GROUP BY语句用于去重和配合聚合函数使用,HAVING语句作为WHERE与聚合函数的结合,以及ORDER BY语句实现全局排序。讲解了各个语句的功能、使用场景和示例,帮助理解Hive数据处理操作。
摘要由CSDN通过智能技术生成

本文部分参考自:https://blog.csdn.net/qq_23897391/article/details/90897373


Hive第六天——Hive函数

自己的话:千里之行,始于足下。

每天都要保持前进,我势必要有强劲的实力,再跟明天的自己问好。

GROUP BY语句、HAVING语句、ORDER BY语句


一、GROUP BY语句

GROUP BY语句 表示按照某些字段的值进行分组,有相同的值放到一起,有两种用法。

1.去重
(1)功能:

在HQL语句中

有WHERE语句的话,则GROUP BY语句紧跟在WHERE语句后,没有WHERE语句,则GROUP BY语句紧跟在表名后;
SELECT后的列名必须全部出现在GROUP BY语句后;
GROUP BY语句后不可使用SELECT语句中新起的别名。

具体语法如下:

SELECT 列名
FROM 表名
WHERE 列名 运算符 值 [AND 列名 运算符 值] [OR 列名 运算符 值]
GROUP BY 列名;

这个语句的含义是将列1和列2中一样的值放到一个组中,然后两列值的所有组合都只保留一个,最终达到对两列值所有组合去重的效果。

(2)举例:

<1>首先查出user_id为10600的所有记录,可以看到三条记录的user_id、platform、is_active三个字段是相同的,只是时间和使用次数不同。

SELECT user_id,platform,use_cnt,is_active,date_8
FROM app.t_od_use_cnt
WHERE date_8 >= 20190101
      AND user_id = 10600;

运行结果如下:

hive > SELECT user_id,platform,use_cnt,is_active,date_8
     > FROM app.t_od_use_cnt
     > WHERE date_8 >= 20190101
     > AND user_id = 10600;
OK
user_id	platform	use_cnt	is_active	date_8
10600	2	46	1	20190101
10600	2	49	1	20190102
10600	2	11	1	20190103
Time taken: 0.169 seconds, Fetched: 3 row(s)

<2>查询上面三个一样的字段,加上GROUP BY语句,命令如下:

SELECT user_id,platform,is_active
FROM app.t_od_use_cnt
WHERE date_8 >= 20190101
      AND user_id = 10600
GROUP BY user_id
      ,platform
      ,is_active;

使用GROUP BY语句Hive会产生Mapreduce,所以会产生很多无关的运行日志。

运行结果如下:


user_id	platform	is_active
10600	2	1

可以看到三行一样的数据只返回了一行,达到了去重的效果。

<3>Hive中去重还可以使用DISTINCT关键字,用法如下:

SELECT DISTINCT user_id,platform,is_active
FROM app.t_od_use_cnt
WHERE date_8 >= 20190101
      AND user_id = 10600;

运行结果是一样的,但去重时不建议使用DISTINCT,因为当数据量很大时会产生数据倾斜,导致DISTINCT运行效率相比GROUP BY 会低很多。当数据量较小时两者差距则不大,甚至可能DISTINCT效率更高。但在实际工作中数据量动辄千万行上亿行,所以强烈推荐养成使用GROUP BY去重的习惯。

2.与聚合函数一起使用(*)

GROUP BY与聚合函数一起使用时,必须将所有select语句中的非聚合函数字段全部GROUP BY,否则会报错。语法如下:

SELECT 列名
      ,aggregate_function(列名) AS num
FROM 表名
WHERE 列名 运算符 值 [AND 列名 运算符 值
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值