十一、行转列、列转行函数

一、行转列

1、相关行数

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

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

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。



2、数据准备

数据

[root@hadoop102 datas]$ vi person.txt

孙悟空  白羊座  A
大海    射手座  A
宋宋    白羊座  B
猪八戒  白羊座  A
凤姐    射手座  A

建表
create table person_info(
name string, 
constellation string, 
blood_type string) 
row format delimited fields terminated by "\t";

导入数据
load data local inpath '/opt/module/datas/person.txt' into table person_info;
3、concat函数使用
hive (default)> select name,concat(constellation,',',blood_type) hb from person_info;
OK
name    hb
孙悟空  白羊座,A
大海    射手座,A
宋宋    白羊座,B
猪八戒  白羊座,A
凤姐    射手座,A
4、collect_set 数据列去重聚合
select hb,collect_set(name) names 
from (
select name,concat(constellation,',',blood_type) hb from person_info
) t 
group by t.hb;

hb      names
射手座,A        ["大海","凤姐"]
白羊座,A        ["孙悟空","猪八戒"]
白羊座,B        ["宋宋"]

5、concat_ws 将arr数组列合并为字符串
select hb,concat_ws('|',collect_set(name)) namestr
from (
select name,concat(constellation,',',blood_type) hb from person_info
) t 
group by t.hb;

hb      namestr
射手座,A        大海|凤姐
白羊座,A        孙悟空|猪八戒
白羊座,B        宋宋

二、列转行

1、函数说明

EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

LATERAL VIEW用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2、数据准备

将前面数据聚合行函数sql,新建表

create table test2 as
select hb,collect_set(name) names 
from (
select name,concat(constellation,',',blood_type) hb from person_info
) t 
group by t.hb;

#数据查看
hive (default)> select hb,names from test2;
OK
hb      names
射手座,A        ["大海","凤姐"]
白羊座,A        ["孙悟空","猪八戒"]
白羊座,B        ["宋宋"]

3、将names数据炸裂开变为行
hive (default)> select hb,name from test2 lateral view explode(names) table_tmp as name;
OK
hb      name
射手座,A        大海
射手座,A        凤姐
白羊座,A        孙悟空
白羊座,A        猪八戒
白羊座,B        宋宋
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Oracle数据库中,行转列列转行是一种常见的数据转换操作,可以通过使用Oracle的PIVOT和UNPIVOT函数来实现。 1. 行转列(PIVOT): 行转列是将一行数据转换为多列数据的操作。在Oracle中,可以使用PIVOT函数来实现行转列操作。Pivot函数将行数据按照指定的列进行分组,并将每个分组的值转换为新的列。 例如,假设有以下表格"sales": ``` +---------+-------+-------+ | Product | Month | Sales | +---------+-------+-------+ | A | Jan | 100 | | A | Feb | 200 | | B | Jan | 150 | | B | Feb | 250 | +--+-------+ ``` 可以使用PIVOT函数将上述表格按照月份进行行转列操作: ```sql SELECT * FROM sales PIVOT ( SUM(Sales) FOR Month IN ('Jan', 'Feb') ); ``` 结果如下: ``` +--+-----+-----+ | A | 100 | 200 | | B | 150 | 250 | +---------+-----+-----+ ``` 2. 列转行(UNPIVOT): 列转行是将多列数据转换为一行数据的操作。在Oracle中,可以使用UNPIVOT函数来实现列转行操作。Unpivot函数将指定的列转换为新的行。 例如,假设有以下表格"sales": ``` +--+-----+ | A | 100 | 200 | | B | 150 | 250 | +---------+-----+-----+ ``` 可以使用UNPIVOT函数将上述表格进行列转行操作: ```sql SELECT * FROM sales UNPIVOT ( Sales FOR Month IN (Jan, Feb) ); ``` 结果如下: ``` +---------+-------+-------+ | Product | Month | Sales | +---------+-------+-------+ | A | Jan | 100 | | A | Feb | 200 | | B | Jan | 150 | | B | Feb | 250 | +--+-------+ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值