hive 列转行函数Lateral View + explode *

列转行函数介绍

EXPLODE(col)

EXPLODE(col)
大白话是,如果你传递的参数是Array, 会给这个Array分隔转成多行 ,如果你传递的是Map,就会给Map里面的每个元素分隔成多行和多列. 参数只能是Array或者是Map

explode函数属于udtf,udtf在使用时候,不能和其它表达式一起出现在select子句后,言外之意只能单独出现在select子句中.

LATERAL VIEW

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

需求

将电影分类中的数组数据展开。结果如下:
比如说 疑犯追踪 属于 悬疑的,又属于动作的 又属于科幻的 又属于剧情 的

《疑犯》 悬疑,动作,科幻,爱情
《lie to me》 悬疑,警匪,动作,心理,剧情
《战狼》 战争,动作,灾难

转成下面的格式

《疑犯》 悬疑
《疑犯》 动作
《疑犯》 科幻
《疑犯》 爱情
《lie to me》 悬疑
《lie to me》 警匪
《lie to me》 动作
《lie to me》 心理
《lie to me》 剧情
《战狼》 战争
《战狼》 动作
《战狼》 灾难

准备数据

movie_info.txt
千万注意 电影名和类目之前要用 tab 分隔,不要弄错了,否则就出现问题.

《疑犯》	悬疑,动作,科幻,爱情
《lie to me》	悬疑,警匪,动作,心理,剧情
《战狼》	战争,动作,灾难

查看是否用指定分隔符
有^I 说明是tab分割的

[root@zjj101 soft]# cat -T movie_info.txt 
《疑犯》^I悬疑,动作,科幻,爱情
《lie to me》^I悬疑,警匪,动作,心理,剧情
《战狼》^I战争,动作,灾难

创建表

sql:

create table movie_info
(
    movie    string,
    category array<string>
)
    row format delimited
        fields terminated by "\t"
        collection items terminated by ",";

指定分隔符用 tab分隔的,也就是\t ,
指定集合类目用逗号进行分隔的

导入数据

sql

load data local inpath "/root/soft/movie_info.txt" into table movie_info;

思路

将类目进行行转列
sql:

select explode(category)
from movie_info;

在这里插入图片描述

现在想办法让每个类目和电影名字做关联,

sql:

select movie, explode(category)
from movie_info;

会报错.因为movie的结果只有三条,而explode(category)有 4 + 5 + 3 = 12条记录。解决办法,使用LATERAL VIEW函数.

LATERAL VIEW

1.Lateral View 用于和UDTF函数【explode,split】结合来使用。
2.首先通过UDTF函数将数据拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
3…主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。
4.语法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)

使用LATERAL VIEW + explode 函数进行查询
sql:


select movie, category_name
from movie_info
         LATERAL VIEW explode(category) tmpTable as category_name;
-- category_name 是给 explode(category) 列起的别名

在这里插入图片描述

Hive SQL中,使用Lateral View可以将一个表的一列拆分成多行,以便进行更复杂的查询和分析。在Lateral View中,最常用的函数是posexplodeexplode。 在引用中的例子中,使用了Lateral View posexplode函数将id列按逗号分隔拆分成多行,同时生成了一个新的列single_id_index和single_id。 在引用中的例子中,使用了两次Lateral View posexplode函数和where子句进行筛选。首先,将id列按逗号分隔拆分成多行,并生成新的列single_id_index和single_id。然后,将tim列按逗号分隔拆分成多行,并生成新的列single_yim_index和single_tim。最后,使用where条件将single_id_index和single_yim_index相等的行筛选出来。 在引用中的例子中,使用了Lateral View explode函数将ordr_set表中的ordr_id列拆分成多行,并将每一行与相应的user_id和user_layer进行拆分。tmp1是虚拟表的表名,ordr_id是拆分后的字段。 因此,Lateral ViewHive SQL中是一种非常有用的函数,可以帮助我们处理包含多值的列,并进行更复杂的查询和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Hive SQL中的 lateral viewexplode列转行)以及行转列](https://blog.csdn.net/qq_42374697/article/details/115273726)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Hive SQL中的lateral view explode](https://blog.csdn.net/weixin_38753213/article/details/115364880)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值