Hive–行转列、列转行
并不是真正意义上的行转列、列转行。
只是这样叫的。
行转列
相关函数:
- CONCAT(stringA,stringB,stringC):返回输入字符串拼接后的结果,支持输入任意多个字符串
测试结果:
可以连接任意多个:
- CONCAT_WS(“分隔符”,stringA,stringB):是一个特殊的CONCAT(),第一个参数是参数间的分隔符(或者说是拼接符),如果拼接福是null。返回值也是null。
需要注意的是,拼接的必须是字符串,拼接数据库表字段的时候,只能是字符串类型才行。
测试结果:
- COLLECT_SET(col):函数只接受基本数据类型,主要是将某字段数据去重,整合成array类型。
测试结果:
单独好像没啥用,可以concat_ws和collect_set联用。
案例:
表数据:
name | Constellation | blood_type |
---|---|---|
八戒 | 白羊座 | A |
猴哥 | 射手座 | A |
松松 | 白羊座 | B |
猪八戒 | 白羊座 | A |
凤姐 | 射手座 | A |
需要得到的结果:
射手座,A 猴哥|凤姐
白羊座,A 八戒|猪八戒
白羊座,B 松松
- 先存入hdfs文件中
vim person.txt
八戒 白羊座 A
猴哥 射手座 A
松松 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A
- 创建hive表并导入数据
create table person_info(
name string,
xingzuo string,
blood_type string)
row format delimited fields terminated by "\t";
load data local inpath '/opt/module/datas/person.txt' into table person_info;
-
按需求查询
第一步:
先将第一列合并,得到一个中间结果
接着得到最终结果:
注意:
collect_set()是个聚合函数,需要和group by一同使用
列转行
直接根据案例来学习两个函数:
- EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
英文意思:爆炸 - LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
案例:
- 数据准备:
Movie | category |
---|---|
《福尔摩斯》 | 悬疑,动作,科幻,剧情 |
《无间道》 | 悬疑,警匪,动作,心理,剧情 |
《红海行动》 | 战争,动作,灾难 |
- 需求
《福尔摩斯》 悬疑
《福尔摩斯》 动作
《福尔摩斯》 科幻
《福尔摩斯》 剧情
《无间道》 悬疑
《无间道》 警匪
《无间道》 动作
《无间道》 心理
《无间道》 剧情
《红海行动》 战争
《红海行动》 动作
《红海行动》 灾难
- hdfs上创建文件
vi movie.txt
《福尔摩斯》 悬疑,动作,科幻,剧情
《无间道》 悬疑,警匪,动作,心理,剧情
《红海行动》 战争,动作,灾难
- 创建hive表并导入
create table movie_info(
movie string,
category array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/opt/module/datas/movie.txt" into table movie_info;
先测试explode爆炸函数:
得到结果:
然后再按需求查:
select
movie,
category_name
from
movie_info lateral view explode(category) table_tmp as category_name;
即可得到结果。