Hive练习题之行转列(三种解法)

镜像问题:Hive练习题之列转行

源数据

1,语文,98.0
2,数学,80.0
2,政治,78.0
5,语文,88.0
5,数学,66.0
5,政治,99.0

– 建表

create table if not exists ms (grade_id int, subject_name string, max_score double)
row format delimited fields terminated by ",";

–导入数据

load data local inpath "/doit16/ms.txt" into table ms;

想要的结果:
在这里插入图片描述

解法1: 拼接json,然后利用json函数取值
===> tmp
1 {“语文”:80}
2 {“语文”:80,“政治”:88}
5 {“语文”:80,“政治”:88,“数学”:66}

with tmp as(
select
grade_id,
concat_ws(concat_ws(',',collect_list(concat_ws(':',concat_ws(subject_name,'"','"'),cast(max_score as string)))),'{','}') as js
from  (
select 
grade_id,
case 
 when subject_name='语文' then 'yw'
 when subject_name='数学' then 'sx'
 when subject_name='政治' then 'zz'
end as subject_name,
max_score
from ms
) o 
group by grade_id
)

select
grade_id,
nvl(get_json_object(js, '$.yw'),0) as `语文`,
nvl(get_json_object(js, '$.sx'),0) as `数学`,
nvl(get_json_object(js, '$.zz'),0) as `政治`

from tmp

;

解法2: 利用str_to_map,生成:课程->成绩的hashmap,然后取值

str_to_map函数说明, 函数需要三个参数,第一个是text, 第二个是切分各个键值对的分隔符, 第三个是切分key-value的分隔符
如果只传入第一个参数, 第二个参数默认使用逗号,第三个参数默认使用冒号
在这里插入图片描述

1 语文 98.0
2 数学 80.0
2 政治 78.0
5 语文 88.0
5 数学 66.0
5 政治 99.0

with tmp as (
select
grade_id,
str_to_map(concat_ws(',',collect_list(concat_ws(':',subject_name,cast(max_score as string)))),',',':') as cj
--str_to_map函数传入的后两个参数可以省略
from ms
group by grade_id
)

select
grade_id,
nvl(cj['语文'] ,0)as `语文`,
nvl(cj['数学'] ,0)as `数学`,
nvl(cj['政治'] ,0)as `政治`
from tmp

解法3:

select
 grade_id,
 nvl(max(yw),0) as `语文`,
 nvl(max(sx) ,0) as  `数学`,
 nvl(max(zz) ,0) as  `政治`
from 
(
select
grade_id,
case when 
 subject_name ='语文' then max_score end as  `yw`,
case when
 subject_name ='数学' then max_score  end as  `sx`,
case when
 subject_name ='政治' then max_score  end as  `zz`
from
ms) t
group by grade_id

加强版

select
 grade_id,
 max(case when subject_name = '语文' then max_score else 0 end ) as `语文`,
 max(case when subject_name = '数学' then max_score else 0 end ) as `数学`,
 max(case when subject_name = '政治' then max_score else 0 end ) as `政治`
from
    ms
group by 
   grade_id
;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive中的列转行和行转列是通过使用一些特定的内置函数和关键字来实现的。列转行可以使用EXPLODE函数,该函数可以将一个包含复杂结构的数组或者映射拆分成多行。行转列可以使用collect_set函数,该函数将某一列的所有数据转化为一个集合,并且可以使用concat_ws函数将集合中的所有元素以逗号分割连接成一个字符串。此外,为了使用EXPLODE和LATERAL VIEW函数,你可以使用LATERAL VIEW关键字,语法为LATERAL VIEW udtf(expression) tableAlias AS columnAlias。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [hive列转行案例](https://download.csdn.net/download/weixin_38581777/14037437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [hive行转列与列转行](https://blog.csdn.net/qq_24790473/article/details/109710145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [hive操作(行转列,列转行)](https://blog.csdn.net/aiduo3346/article/details/102085019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值