Hive -- 行转列、列转行

Hive–行转列、列转行

并不是真正意义上的行转列、列转行。
只是这样叫的。

行转列

相关函数:
  1. CONCAT(stringA,stringB,stringC):返回输入字符串拼接后的结果,支持输入任意多个字符串
测试结果:

concat测试
可以连接任意多个:
concat测试

  1. CONCAT_WS(“分隔符”,stringA,stringB):是一个特殊的CONCAT(),第一个参数是参数间的分隔符(或者说是拼接符),如果拼接福是null。返回值也是null。
    需要注意的是,拼接的必须是字符串,拼接数据库表字段的时候,只能是字符串类型才行。
测试结果:

concat_ws测试

  1. COLLECT_SET(col):函数只接受基本数据类型,主要是将某字段数据去重,整合成array类型。
测试结果:

collect_set
result

单独好像没啥用,可以concat_ws和collect_set联用。

案例:

表数据:

nameConstellationblood_type
八戒白羊座A
猴哥射手座A
松松白羊座B
猪八戒白羊座A
凤姐射手座A

需要得到的结果:

射手座,A 猴哥|凤姐
白羊座,A 八戒|猪八戒
白羊座,B 松松

  1. 先存入hdfs文件中

vim person.txt
八戒 白羊座 A
猴哥 射手座 A
松松 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A

  1. 创建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;
  1. 按需求查询

    第一步:
    在这里插入图片描述

    先将第一列合并,得到一个中间结果
    在这里插入图片描述
    接着得到最终结果:
    在这里插入图片描述
    在这里插入图片描述

注意:

collect_set()是个聚合函数,需要和group by一同使用

列转行

直接根据案例来学习两个函数:

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

案例:

  1. 数据准备:
Moviecategory
《福尔摩斯》悬疑,动作,科幻,剧情
《无间道》悬疑,警匪,动作,心理,剧情
《红海行动》战争,动作,灾难
  1. 需求

《福尔摩斯》 悬疑
《福尔摩斯》 动作
《福尔摩斯》 科幻
《福尔摩斯》 剧情
《无间道》 悬疑
《无间道》 警匪
《无间道》 动作
《无间道》 心理
《无间道》 剧情
《红海行动》 战争
《红海行动》 动作
《红海行动》 灾难

  1. hdfs上创建文件

vi movie.txt
《福尔摩斯》 悬疑,动作,科幻,剧情
《无间道》 悬疑,警匪,动作,心理,剧情
《红海行动》 战争,动作,灾难

  1. 创建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;

即可得到结果。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值