hive中的行转列,列转行

行转列:
1.行转列所用的函数
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数作为剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段(也就是将一列字段去重以后放在一个数组中)。

在这里插入图片描述

案例分析:原数据为用户的姓名,住址,年龄(中间为\t分割)。

在这里插入图片描述

目标数据:(先将住址和年龄合并成一列数据,再将住址和年龄相同的用户放到一起形成如下的表)

在这里插入图片描述

思路分析:1.先将住址和年龄合并成一列数据
在这里插入图片描述

2.按照住址和年龄分组,然后用COLLECT_SET(col)函数将用户名变为一行。

实际操作:
1.建表:

create table usertab(
name string, 
address string, 
age string) 
row format delimited fields terminated by "\t";

2.导入数据并查询:

load data local inpath '/opt/demo.txt' into table usertab;

在这里插入图片描述

接上面思路分析第一步:先将住址和年龄合并成一列数据

select name,concat_ws(',',address,age) address_age from usertab;

在这里插入图片描述
第二步:按照住址和年龄分组,然后用COLLECT_SET(col)函数将用户名变为一行,最后用concat_ws()函数来连接用户名字。

select address_age,concat_ws('-',collect_set(name)) from (select name,concat_ws(',',address,age) address_age from usertab) t group by address_age;

最终结果:

在这里插入图片描述

列转行:

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

案例:原数据为姓名和喜欢吃的水果(\t分割字段)

在这里插入图片描述

目标数据,将原数据中每个人喜欢吃的水果分成多行,如下为目标数据。

在这里插入图片描述

1.创建表并且导入数据

create table fruit(
    name string,
    like_fruits  array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/opt/fruit.txt"  into table fruit;

在这里插入图片描述

查询数据的sql

select
    name,
    like_fruits_name
from
    fruit lateral view explode(like_fruits) table_tmp as like_fruits_name;

在这里插入图片描述

这里需要注意的是函数explode(like_fruits)的别名是在as 后面,table_tmp为explode函数将like_fruits字段中的值分解后形成的表。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值