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的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

group by 子句中的 sparkSQL Map 列

使用SparkSQL迁移oracle数据到impala创建的kudu表中,出现Primary key column riskcode is not set错误

使用SparkSQL迁移oracle数据到impala创建的kudu表中,出现Primary key column riskcode is not set错误

TSQL 分组集(Grouping Sets)

在 Spark SQL 中使用 collect_list 和 collect_set

Spark SQL 中 Group By 子句的底层实现