hive行转列和列转行

创建测试表:
create table stu1( 
name         string comment '姓名',
chinese      string comment '语文',
math         string comment '数学',
english      string comment '英语'
)comment '学生成绩表1' row format delimited fields terminated by ',';

create table stu2( 
name          string comment '姓名',
subject       string comment '科目',
performance   string comment '成绩'
)comment '学生成绩表2' row format delimited fields terminated by ',';

加载数据:
load data local inpath '/home/Devin/stu2.txt' into table stu2;

hive (pingan)> select * from stu1;
OK
stu1.name       stu1.chinese    stu1.math       stu1.english
小王    				75      		73      		86
小李   			    98      		87     		    89
小刘    				76      		87      		65
Time taken: 0.355 seconds, Fetched: 3 row(s)

hive (pingan)> select * from stu2;                                           
OK
stu2.name       stu2.suject     stu2.performance
小王    			chinese 			75
小李    			chinese 			98
小刘    			chinese			    76
小王    			math    			73
小李    			math    			87
小刘    			math    			87
小王    			english 			86
小李    			english 			89
小刘    			english 			65
Time taken: 0.078 seconds, Fetched: 9 row(s)

行转列:stu1数据格式转为stu2数据格式
select name,
       t.subject,
       t.performance
    from stu1 
    lateral view explode(
        str_to_map(
            concat('chinese=',chinese,'&math=',math,'&english=',english)
        ,'&','=')
    ) t as subject,performance;
name    t.subject       t.performance
小王    math    73
小王    english 86
小王    chinese 75
小李    math    87
小李    english 89
小李    chinese 98
小刘    math    87
小刘    english 65
小刘    chinese 76
Time taken: 89.781 seconds, Fetched: 9 row(s)
列转行:stu2数据格式转为stu1数据格式
select name,
       sum(case when subject = 'chinese' then performance end) as chinese,
       sum(case when subject = 'math' then performance end) as math,
       sum(case when subject = 'english' then performance end) as english 
	from stu2 
	group by name;
name    chinese math    english
小刘    76.0    87.0    65.0
小李    98.0    87.0    89.0
小王    75.0    73.0    86.0
Time taken: 88.087 seconds, Fetched: 3 row(s)

Lateral View用法与Hive UDTF explode:https://blog.csdn.net/oopsoom/article/details/26001307
hive中UDF、UDAF和UDTF详解:https://blog.csdn.net/zhaoli081223/article/details/46637517

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive中的行转列列转行可以通过使用函数EXPLODE和LATERAL VIEW来实现。函数EXPLODE(col)用于将Hive的一列中复杂的数组或者Map结构拆分成多行。LATERAL VIEW是用于和split、explode等函数一起使用的,可以将一列展开成多列或将多列合并成一列。 举个例子来说明,假设我们有一个表person_info,其中包含name、constellation和blood_type三列。要将表中的name列中的值拆分成多行,可以使用LATERAL VIEW和EXPLODE函数,具体的语句如下: SELECT t1.base, concat_ws('|', collect_set(t1.name)) name FROM (SELECT name, concat(constellation, ",", blood_type) base FROM person_info) t1 GROUP BY t1.base; 在上述查询中,通过LATERAL VIEW和EXPLODE函数,将name列拆分成多行,然后使用concat_ws函数将拼接后的结果作为新的name列。最后,通过GROUP BY对base列进行分组。这样就实现了Hive中的行转列操作。<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_1"}}] [.reference_item style="max-width: 50%"] - *2* *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_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值