在最近写脚本时发现,一直使用的grouping()函数只能小写,改成大写直接报错。下面例子来证明一下。
1.如下图为表的数据
hive> select * from dwd_user_page_view_dm;
OK
user_id pv pt_d
0006D2BC14DF914C0 62 20201011
83AD10183789E78D4 4 20201011
15AE1A14B85921889 10 20201021
83AD10183789E78D4 2 20201021
993BD7AD13B621BA0 8 20201021
15AE1A14B85921889 2 20201031
83AD10183789E78D4 7 20201031
0006D2BC14DF914C0 33 20201031
0006D2BC14DF914C0 35 20201041
0006D2BC14DF914C0 12 20201041
83AD10183789E78D4 3 20201041
993BD7AD13B621BA0 10 20201041
993BD7AD13B621BA0 13 20201041
83AD10183789E78D4 5 20201051
15AE1A14B85921889 12 20201051
15AE1A14B85921889 9 20201061
0006D2BC14DF914C0 25 20201061
83AD10183789E78D4 4 20201061
83AD10183789E78D4 1 20201071
0006D2BC14DF914C0 94 20201071
15AE1A14B85921889 3 20201081
993BD7AD13B621BA0 44 20201081
993BD7AD13B621BA0 26 20201091
15AE1A14B85921889 183 20201091
993BD7AD13B621BA0 98 20201101
15AE1A14B85921889 322 20201111
993BD7AD13B621BA0 31 20201121
2.执行如下语句
SELECT
user_id
,pt_d
,SUM(pv) AS cnt
,GROUPING(pt_d) AS flag2
,GROUPING(user_id) AS flag3
FROM dwd_user_page_view_dm
GROUP BY pt_d,user_id WITH ROLLUP
这里可以看出来GROUPING(pt_d)使用的是大写字母。直接报错如下图。
文章图片
3.grouping()改成小写执行如下语句
SELECT
user_id
,pt_d
,SUM(pv) AS cnt
,grouping(pt_d) AS flag2
,grouping(user_id) AS flag3
FROM dwd_user_page_view_dm
GROUP BY pt_d,user_id WITH ROLLUP
可以看出执行结果
Total MapReduce CPU Time Spent: 6 seconds 570 msec
OK
hive>
user_id pt_d cnt flag2 flag3
NULL NULL 1058 1 1
NULL 20201011 66 0 1
0006D2BC14DF914C0 20201011 62 0 0
83AD10183789E78D4 20201011 4 0 0
NULL 20201021 20 0 1
15AE1A14B85921889 20201021 10 0 0
83AD10183789E78D4 20201021 2 0 0
993BD7AD13B621BA0 20201021 8 0 0
NULL 20201031 42 0 1
0006D2BC14DF914C0 20201031 33 0 0
15AE1A14B85921889 20201031 2 0 0
83AD10183789E78D4 20201031 7 0 0
NULL 20201041 73 0 1
0006D2BC14DF914C0 20201041 47 0 0
83AD10183789E78D4 20201041 3 0 0
993BD7AD13B621BA0 20201041 23 0 0
NULL 20201051 17 0 1
15AE1A14B85921889 20201051 12 0 0
83AD10183789E78D4 20201051 5 0 0
NULL 20201061 38 0 1
0006D2BC14DF914C0 20201061 25 0 0
15AE1A14B85921889 20201061 9 0 0
83AD10183789E78D4 20201061 4 0 0
NULL 20201071 95 0 1
0006D2BC14DF914C0 20201071 94 0 0
83AD10183789E78D4 20201071 1 0 0
NULL 20201081 47 0 1
15AE1A14B85921889 20201081 3 0 0
993BD7AD13B621BA0 20201081 44 0 0
NULL 20201091 209 0 1
15AE1A14B85921889 20201091 183 0 0
993BD7AD13B621BA0 20201091 26 0 0
NULL 20201101 98 0 1
993BD7AD13B621BA0 20201101 98 0 0
NULL 20201111 322 0 1
15AE1A14B85921889 20201111 322 0 0
NULL 20201121 31 0 1
993BD7AD13B621BA0 20201121 31 0 0
Time taken: 49.605 seconds, Fetched: 38 row(s)
这里可以看出grouping(pt_d)按照分组的标注为0,没有按照grouping的参数分组标志为1.
比对结果执行如下语句
文章图片
rollup的执行分组GROUP BY pt_d,user_id WITH ROLLUP按照这个顺序
可以看出来结果是按照GROUP BY(),GROUP BY(pt_d)GROUP BY(pt_d,user_id)
好奇为何没有按照user_id分组呢
执行
SELECT
user_id
,NULL AS pt_d
,SUM(pv) AS cnt
FROM dwd_user_page_view_dm
GROUP BY user_id
结果为:
OK
user_id pt_d cnt
0006D2BC14DF914C0 NULL 261
15AE1A14B85921889 NULL 541
83AD10183789E78D4 NULL 26
993BD7AD13B621BA0 NULL 230
这个不得增加我的好奇心探索一下cube的用法
SELECT
user_id
,pt_d
,SUM(pv) AS cnt
,grouping(pt_d) AS flag2
,grouping(user_id) AS flag3
FROM dwd_user_page_view_dm
GROUP BY pt_d,user_id WITH CUBE
看下图结果
user_id pt_d cnt flag2 flag3
NULL NULL 1058 1 1
0006D2BC14DF914C0 NULL 261 1 0
15AE1A14B85921889 NULL 541 1 0
83AD10183789E78D4 NULL 26 1 0
993BD7AD13B621BA0 NULL 230 1 0
NULL 20201011 66 0 1
0006D2BC14DF914C0 20201011 62 0 0
83AD10183789E78D4 20201011 4 0 0
NULL 20201021 20 0 1
15AE1A14B85921889 20201021 10 0 0
83AD10183789E78D4 20201021 2 0 0
993BD7AD13B621BA0 20201021 8 0 0
NULL 20201031 42 0 1
0006D2BC14DF914C0 20201031 33 0 0
15AE1A14B85921889 20201031 2 0 0
83AD10183789E78D4 20201031 7 0 0
NULL 20201041 73 0 1
0006D2BC14DF914C0 20201041 47 0 0
83AD10183789E78D4 20201041 3 0 0
993BD7AD13B621BA0 20201041 23 0 0
NULL 20201051 17 0 1
15AE1A14B85921889 20201051 12 0 0
83AD10183789E78D4 20201051 5 0 0
NULL 20201061 38 0 1
0006D2BC14DF914C0 20201061 25 0 0
15AE1A14B85921889 20201061 9 0 0
83AD10183789E78D4 20201061 4 0 0
NULL 20201071 95 0 1
0006D2BC14DF914C0 20201071 94 0 0
83AD10183789E78D4 20201071 1 0 0
NULL 20201081 47 0 1
15AE1A14B85921889 20201081 3 0 0
993BD7AD13B621BA0 20201081 44 0 0
NULL 20201091 209 0 1
15AE1A14B85921889 20201091 183 0 0
993BD7AD13B621BA0 20201091 26 0 0
NULL 20201101 98 0 1
993BD7AD13B621BA0 20201101 98 0 0
NULL 20201111 322 0 1
15AE1A14B85921889 20201111 322 0 0
NULL 20201121 31 0 1
993BD7AD13B621BA0 20201121 31 0 0
rollup和cube的结果比对
文章图片
可以看出来结果是按照GROUP BY(),GROUP BY(user_id)GROUP BY(pt_d),GROUP BY(pt_d,user_id)
看到这里必须要把GROUP_ID打印出来。不看看的一脸懵逼,有么有。
SELECT
user_id
,pt_d
,SUM(pv) AS cnt
,GROUPING__ID AS id
FROM dwd_user_page_view_dm
GROUP BY pt_d,user_id WITH CUBE
【hive|hive3.0惊天大bug发现,grouping()函数只能小写,大写直接报错,hive不是不区分大小写吗.】这里喜欢把GROUPING__ID改成GROUPING__ID()试一试会报错无效的函数记住GROUPING__ID没有的括号噢
文章图片
推荐阅读
- MySQL|10分钟必懂-深入理解MySQL隔离级别与锁机制
- MySQL数据库|MySQL数据库 --- Java的JDBC编程
- sql|实训第二天记录-sql注入实战(教务系统模拟注入+sqli-labs less1-5)
- SQL注入|SQL注入漏洞详解(一)
- 网络安全|利用SQL注入漏洞登录后台
- #|DVWA-sql注入漏洞详解
- sql|SQL注入漏洞详解
- sql|SQL注入——基于报错的注入(2)
- 数据库|【数据库原理及应用教程】【数据库系统的体系结构】【1.4-1.6】