1、行转列(一)

主要使用:

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数是剩余其他参数间的分隔符。
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

示例

原始数据:

nameconstellationblood_type
宋江白羊座A
鲁智深射手A
武松白羊座B
潘金莲白羊座A
西门庆射手A

期望输出结果:

constell_bloodname_list
射手座,A鲁智深&西门庆
白羊座,A宋江&潘金莲
白羊座,B武松

实现:

select
    t1.base,
    concat_ws('&', collect_set(t1.name)) name
from
    (select
        name,
        concat(constellation, ",", blood_type) constell_blood
    from
        person_info) t1
group by
    t1.constell_blood;

2、列转行(一)

主要使用
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

示例

原始数据:

moviecategory
《疑犯追踪》悬疑&动作
《Lie to me》悬疑&警匪

期望输出结果:

moviecategory_name
《疑犯追踪》悬疑
《疑犯追踪》动作
《Lie to me》悬疑
《Lie to me》警匪

实现:

select
    movie,
    category_name
from 
 movie_info 
lateral view explode(split(category, "\\&")) table_tmp as category_name;

3、行转列(二)

主要使用sum(case when )

示例

原始数据:

stu_idnamecoursescore
01zhangsanmath90
01zhangsanchinese88
01zhangsanenglish88
02lisimath66
02lisichinese77
02lisienglish80

期望输出结果:

stu_idnamemat_scorechi_scoreeng_score
01zhangsan908888
02lisi667780

实现1:使用sum if 或sum(case when )条件判断

select 
stu_id,
name,
sum(case when course='math' then score else 0 end) mat_score,
sum(case when course='chinese' then score else 0 end) chi_score,
sum(case when course='english' then score else 0 end) eng_score
from stu001 
group by stu_id,name

实现2:map的思想,先拼接成map的形式,再取下标

select 
stu_id
,name
,course_score_map['math'] as math_score
,course_score_map['chinese'] as math_score
,course_score_map['english'] as math_score
from 
(
select 
stu_id
,name
,str_to_map(concat_ws(',',collect_set(concat_ws(':',course,cast(score as String)))))course_score_map
from  stu001 
group by 
stu_id
,name
) tt

4、列转行(二)

示例

主要使用union all
原始数据:

stu_idnamemat_scorechi_scoreeng_score
01zhangsan908888
02lisi667780

期望输出结果:

stu_idnamecoursescore
01zhangsanmath90
01zhangsanchinese88
01zhangsanenglish88
02lisimath66
02lisichinese77
02lisienglish80

实现1:union all

select  
stu_id
,name
,'math' as course
,mat_score as score
from  stu002 

union all 
select  
stu_id
,name
,'chinese' as course
,chi_score as score
from  stu002 

union all 
select  
stu_id
,name
,'english' as course
,eng_score as score
from  stu002 

实现2:炸裂再字符串切割

select 
stu_id
,name
,split(course_score,'\\:')[0] as course
,split(course_score,'\\:')[1] as score
from (
select  
stu_id
,name 
,concat('math',':',mat_score,'##','chinese',':',chi_score,'##','english',':',eng_score) as course_score_list
from stu002 
) tt 
lateral view explode(split(course_score_list, "\\##")) table_tmp as course_score;
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐