hive行转列与列转行

简单行转列

  • 将一个融合多个信息的字段拆分为多行
aaa,bbb,ccc  ===>  aaa
                   bbb
                   ccc
  • 实现方法:利用内置UDTF函数explode实现
split('aaa,bbb,ccc',','); //根据逗号进行分割,将复合字段转化为hive数组类型
explode(split('aaa,bbb,ccc',',')); //对得到的数据使用explode函数拆分为多行
  • 实现结果
hive> select split('aaa,bbb,ccc',',');
OK
["aaa","bbb","ccc"]
----------------------------------------------
hive> select explode(split('aaa,bbb,ccc',','));
OK
aaa
bbb
ccc

复杂行转列

  • 需求:将转换后的多行信息与原表字段关联查询。
  • 比如:
    原始数据student表
name hobby
tom 唱歌,跳舞,弹琴
jack 唱歌,绘画,打篮球
  • 转换后数据
tom 唱歌
tom 跳舞
tom 弹琴
jack 唱歌
jack 绘画
jack 打篮球
  • 拆分后的字段与原表的name字段是没有办法直接关联的,因为它们不是一张表。可以使用later view侧视图进行关联查询。
explode(split(hobby,',')) temp as x   //此语句本身返回的就是一张虚拟表 记为temp 可以为temp表的列指定字段名x
student lateral view temp     //使用later view可以直接关联两张表,保持原有映射关系
select student.name,temp.x from student lateral view explode(split(hobby,',')) temp as x;//完整写法
  • 创建student表并加载数据
create external table student
(
   name string,
   hobby string
) row format delimited fields terminated by ' '; 
load data local inpath '/root/student.txt' into table student;
  • 执行sql语句 查看结果
hive> select student.name,temp.x from student lateral view explode(split(hobby,',')) temp as x;
OK
tom     唱歌
tom     跳舞
tom     弹琴
jack    唱歌
jack    绘画
jack    打篮球

简单列转行

  • 将多行数据融合为一行
aaa   ===>   aaa,bbb,ccc
bbb
ccc
  • 实现方法:
collect_set(column) //将某一列所有数据转化为一个集合(去重)
concat_ws(',',collect_set(column))  //将集合中所有元素以逗号分割连接为字符串
  • 将dept表的dep列转为一行 展示结果
select dep from dept;
销售
测试
开发
算法
--------------------------------------------------------
select concat_ws(',',collect_set(dep)) from dept;
销售,测试,开发,算法
  • 此外还有一个聚合函数 collect_list 不去重

复杂列转行

  • 转换后的一行信息与原始行字段关联查询
  • 比如
    原始数据
name hobby
tom 唱歌
tom 跳舞
tom 弹琴
jack 唱歌
jack 绘画
jack 打篮球

结果数据

tom 唱歌,跳舞,弹琴
jack 唱歌,绘画,打篮球
  • 根据name字段进行分组,在每个分组内部name是唯一的可以直接查询,hobby字段就可以使用collect_set与concat_ws进行连接为复合字段。
  • 创建stu表导入数据
create external table stu
(
   name string,
   hobby string
) row format delimited fields terminated by ' '; 
load data local inpath '/root/stu.txt' into table stu;
  • 查询:select name,concat_ws(’,’,collect_set(hobby)) from stu group by name;
  • 结果如下
OK
jack    唱歌,绘画,打篮球
tom     唱歌,跳舞,弹琴
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、付费专栏及课程。

余额充值