天天看點

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;      
hive 列轉行函數Lateral View + explode *

現在想辦法讓每個類目和電影名字做關聯,

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)

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