目录
四:使用concat_ws(',',concat(),concat(),concat())的好处
五:对concat_ws连接起来的data_type字段进行切割
七. max case when ... then ... end
八 深度解析case when 条件1 then ... else 0 end的作用
一:代码样例
下面代码大致框架:内部select分组查询,外部explode炸开后再分组,然后进行select查询。
insert overwrite table temp_table
partition(event_day='{DATE}',dim_type='quanping')
select concat_ws(
'\t',
cast('{DATE}' as string),
cast(coalesce(B.os, '-') as string),
cast(coalesce(B.version, '-') as string),
cast(coalesce(split(tmp_table.data_type, '\\|')[0], '-') as string),
cast('all' as string),
cast('all' as string),
cast(coalesce(sum(split(tmp_table.data_type, '\\|')[1]), 0) as string),
cast(coalesce(count(distinct cuid), 0) as string)
) as dim_value
from(
select
os,
soft_version,
cuid,
concat_ws(
',',
concat('整个屏幕展示', '|',count(case when k='click' and v='fullscreen' then 1 end)),
concat('上下方向', '|',count(case when k='click' and v in ('up_slide','down_slide') and tab='full_screen' then 1 end)),
concat('完整屏幕read', '|',count(case when k='read' and rmb_params['is_fullscreen'] = '1' then 1 end))
) as data_type
from goodview_table
where event_day='{DATE}'
and is_spam=0
and
(
(k='click' and v='fullscreen')
or
(k='click' and v in ('up_slide','down_slide') and tab='full_screen')
or
(k='read' and rmb_params['is_fullscreen']='1') -- 筛选条件
)
group by
os,
soft_version,
cuid
)tab
lateral view explode(split(data_type,',')) tmp_table as data_type
lateral view explode(array('all',os)) B as os
lateral view explode(array('all',soft_version)) B as version
where split(tmp_table.data_type,'\\|')[1] > 0
group by
B.os,
B.version,
split(tmp_table.data_type,'\\|')[0]
【上述数据,名称,核心等已经进行过处理,不涉及具体业务,如有侵权必删】
从里面忘外看,select os,soft_version,cuid,concat_ws(',',concat(维度一及其数量),concat(维度二及其数量),concat(维度三及其数量))
where+限制条件 +
group by os, soft_version,cuid (分组约束)
二:多字段分组还是单字段分组
[注意]:我们的分组有三个字段,分别是os,soft_version,cuid,它的作用是干啥,为什么不直接使用cuid分组呢?
答:对所有数据按照os,soft_version, cuid进行分组,故原始一条条数据变成了一组组数据。
直接使用cuid一个字段分组可以吗?:虽然我们日常理解的是:cuid可以唯一标识一部手机,相当于MySQL中主键一词的意思,但是我们需要有辩证的思维,
cuid在唯一标识一部手机的时候可以视为"主键",但是在不同场景下,它又不是主键了,例如此处是对应的日志情况,一部手机可以产生多条日志,所以此时
直接使用cuid分组和使用os,soft_version,cuid进行分组的效果是不同的。补充一句:如果,我说如果cuid是主键,那么此时使用cuid分组和使用os,soft_version,cuid
进行分组的效果是相同的</