sparksql中grouping sets的使用方法
Posted 浊酒南街
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sparksql中grouping sets的使用方法相关的知识,希望对你有一定的参考价值。
标题
1、关键字
GROUPING SETS: 根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL
GROUPING__ID:表示结果属于哪一个分组集合,属于虚字段
2、简单示例:
关于grouping sets的使用,通俗的说,grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法,等价与多个group by 的语句union all 的结果 。
create table temp.score_grouping as
select
grouping__id, ---grouping__id是两个下划线
class,
sex,
course,
avg(score)
from
tableName
group by --group by包含所需所有维度字段
class,
sex,
course -------此处无逗号
grouping sets
(
(class, course),
( class,sex),
(sex,course),
(course)
)
3、关于一些维度设置为’ALL’
上述sql,我不关心grouping__id,我的需求是有些维度取不到时,用ALL代替,如何处理?
create table temp.score_grouping as
select
grouping__id, ---grouping__id是两个下划线
if(int(grouping__id)& 1=0,'ALL',class) as class, ---- 也可以 if((cast(grouping__id as int) & 1)=0,'ALL',class) as class
if(int(grouping__id)& 2=0,'ALL',sex) as sex,
if(int(grouping__id)& 4=0,'ALL',course) as course,
avg(score)
from
tableName
group by --group by包含所需所有维度字段
class,
sex,
course -------此处无逗号
grouping sets
(
(class, course),
( class,sex),
(sex,course),
(course)
)
注意事项:
1、grouping__id,spark sql分组id是纬度被选中则为0,没被选中则为1,而hive则刚好相反,选中为1,没被选中为0
如果想保持一致,可通过设置 spark.grouping.sets.reference.hive=true 来产生与hive同样的效果;
2、1,2,4 分别对应group by 后的字段顺序,分别是2的0次方,2的1次方,2的2次方;
以上是关于sparksql中grouping sets的使用方法的主要内容,如果未能解决你的问题,请参考以下文章
使用SparkSQL迁移oracle数据到impala创建的kudu表中,出现Primary key column riskcode is not set错误
使用SparkSQL迁移oracle数据到impala创建的kudu表中,出现Primary key column riskcode is not set错误