Hive中explode和lateral view使用方法講解

/*

以下這段文字出自?https://blog.csdn.net/guodong2k/article/details/79459282

explode與lateral view在關(guān)系型數(shù)據(jù)庫(kù)中本身是不該出現(xiàn)的吉嫩,因?yàn)樗某霈F(xiàn)本身就是在操作不滿足第一范式的數(shù)據(jù)(每個(gè)屬性都不可再分)答憔,本身已經(jīng)違背了數(shù)據(jù)庫(kù)的設(shè)計(jì)原理(不論是業(yè)務(wù)系統(tǒng)還是數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)),不過(guò)大數(shù)據(jù)技術(shù)普及后仁卷,很多類似pv养渴,uv的數(shù)據(jù)介劫,在業(yè)務(wù)系統(tǒng)中是存貯在非關(guān)系型數(shù)據(jù)庫(kù)中包归,用json存儲(chǔ)的概率比較大苇经,直接導(dǎo)入hive為基礎(chǔ)的數(shù)倉(cāng)系統(tǒng)中赘理,就需要經(jīng)過(guò)ETL過(guò)程解析這類數(shù)據(jù),explode與lateral view在這種場(chǎng)景下大顯身手扇单。

*/

1. explode

explode是用于處理array商模、map、struct類型的UDTF蜘澜,能夠?qū)⒁恍杏涗洶匆蟛鸱譃槎嘈惺┝鳎_(dá)到行轉(zhuǎn)列的效果。

用法是select explode(expression(col)) from table_name; 要求explode的參數(shù)必須是map或者array類型鄙信。

為了演示用法與效果瞪醋,建立一張hive外部表laternal_explode_test

CREATE EXTERNAL TABLE laternal_explode_test

(

name STRING,

skill ARRAY<STRING>,

friend MAP<STRING,STRING>,

appearance struct<face:STRING,body:STRING>,

sigil STRING

)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '|'

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':'

LINES TERMINATED BY '\n'

STORED AS TEXTFILE

LOCATION '***';

通過(guò)文本向表中灌入數(shù)據(jù),內(nèi)容如下

AegonTargaryen|sword,dragon,wife|before:Velaryon|beautiful,strong|blood and fire

TyrionLannister|wisedom,name,bravery|always:Jamie|ugly,short|hear me roar

TonyStark|money,technology,genuis|now:SteveRogers|handsome,powerful|winter is coming

導(dǎo)入數(shù)據(jù)后装诡,查詢?cè)摫硪埽l(fā)現(xiàn)可以顯示全部三條記錄

select * from laternal_explode_test;

| laternal_explode_test.name | laternal_explode_test.skill | laternal_explode_test.friend | laternal_explode_test.appearance | laternal_explode_test.sigil |

| AegonTargaryen? ? ? ? ? ? ? | ["sword","dragon","wife"]? ? ? ? | {"before":"Velaryon"}? ? ? ? | {"face":"beautiful","body":"strong"}? | blood and fire? ? ? ? ? ? ? |

| TyrionLannister? ? ? ? ? ? | ["wisedom","name","bravery"]? ? | {"always":"Jamie"}? ? ? ? ? ? | {"face":"ugly","body":"short"}? ? ? ? | hear me roar? ? ? ? ? ? ? ? |

| TonyStark? ? ? ? ? ? ? ? ? | ["money","technology","genuis"]? | {"now":"SteveRogers"}? ? ? ? | {"face":"handsome","body":"powerful"}? | winter is coming? ? ? ? ? ? |

使用explode拆分部分字段

select explode(skill) as skills from laternal_explode_test;

| skills |

| sword? ? ? |

| dragon? ? ? |

| wife? ? ? ? |

| wisedom? ? |

| name? ? ? ? |

| bravery? ? |

| money? ? ? |

| technology? |

| genuis? ? ?

select explode(friend) from laternal_explode_test;

| key | value |

| before? | Velaryon? ? |

| always? | Jamie? ? ? ? |

| now? ? | SteveRogers? |

select explode(split(sigil,' ')) from laternal_explode_test;

| blood |

| and? ? |

| fire? ? |

| hear? ? |

| me? ? ? |

| roar? ? |

| winter? |

| is? ? ? |

| coming? |

可以看到explode確實(shí)有爆炸效果,能夠準(zhǔn)確快速拆分map和array鸦采。

但是繼續(xù)使用卻會(huì)發(fā)現(xiàn)explode有明顯的缺陷:

1.不支持同時(shí)select其他字段宾巍。如select name,explode(split(sigil,' ')) from laternal_explode_test;是不允許的,會(huì)報(bào)錯(cuò)渔伯。

2.不支持嵌套顶霞。select explode(explode(friend)) from laternal_explode_test; 也是不行的。

3.不能與group by锣吼、sort by 和cluster by一起使用选浑。

2. lateral view

lateral view專用于與split、explode吐限、stack等UDTF函數(shù)結(jié)合使用鲜侥,主要解決在select使用UDTF做查詢的過(guò)程中查詢不能包含其它字段以及多個(gè)UDTF的問(wèn)題。典型用法是:

table a LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)

對(duì)于上面的select?name,explode(split(sigil,' ')) from laternal_explode_test;如果我們一定要同時(shí)select其他字段诸典,可以改寫為

select name,cc

from laternal_explode_test t1

lateral view explode(split(sigil,' ')) t2 as cc;

上面語(yǔ)句的執(zhí)行過(guò)程可以簡(jiǎn)述為描函,首先通過(guò)explode函數(shù)將sigil列拆分成多行崎苗,再將拆分后的sigil視為一個(gè)虛擬表,即t2舀寓,這個(gè)表只有一列胆数,別名叫cc。最后將多行cc與其對(duì)應(yīng)的name組合起來(lái)互墓,select出結(jié)果必尼。故其結(jié)果是

| name | cc |

+------------------+---------+

| AegonTargaryen? | blood? |

| AegonTargaryen? | and? ? |

| AegonTargaryen? | fire? ? |

| TyrionLannister? | hear? ? |

| TyrionLannister? | me? ? ? |

| TyrionLannister? | roar? ? |

| TonyStark? ? ? ? | winter? |

| TonyStark? ? ? ? | is? ? ? |

| TonyStark? ? ? ? | coming? |

lateral view支持連續(xù)使用,如以下用法

select name,cc,bb

from laternal_explode_test t1

lateral view explode(split(sigil,' ')) t2 as cc

lateral view explode(skill) t3 as bb;

執(zhí)行過(guò)程是從左到右篡撵,t1先和t2組合成一個(gè)虛擬表判莉,然后整個(gè)虛擬表和t3再組成一個(gè)新的虛擬表。結(jié)果如下

| name | cc | bb |

+------------------+---------+-------------+

| AegonTargaryen? | blood? | sword? ? ? |

| AegonTargaryen? | blood? | dragon? ? ? |

| AegonTargaryen? | blood? | wife? ? ? ? |

| AegonTargaryen? | and? ? | sword? ? ? |

| AegonTargaryen? | and? ? | dragon? ? ? |

| AegonTargaryen? | and? ? | wife? ? ? ? |

| AegonTargaryen? | fire? ? | sword? ? ? |

| AegonTargaryen? | fire? ? | dragon? ? ? |

| AegonTargaryen? | fire? ? | wife? ? ? ? |

| TyrionLannister? | hear? ? | wisedom? ? |

| TyrionLannister? | hear? ? | name? ? ? ? |

| TyrionLannister? | hear? ? | bravery? ? |

| TyrionLannister? | me? ? ? | wisedom? ? |

| TyrionLannister? | me? ? ? | name? ? ? ? |

| TyrionLannister? | me? ? ? | bravery? ? |

| TyrionLannister? | roar? ? | wisedom? ? |

| TyrionLannister? | roar? ? | name? ? ? ? |

| TyrionLannister? | roar? ? | bravery? ? |

| TonyStark? ? ? ? | winter? | money? ? ? |

| TonyStark? ? ? ? | winter? | technology? |

| TonyStark? ? ? ? | winter? | genuis? ? ? |

| TonyStark? ? ? ? | is? ? ? | money? ? ? |

| TonyStark? ? ? ? | is? ? ? | technology? |

| TonyStark? ? ? ? | is? ? ? | genuis? ? ? |

| TonyStark? ? ? ? | coming? | money? ? ? |

| TonyStark? ? ? ? | coming? | technology? |

| TonyStark? ? ? ? | coming? | genuis? ? ? |


Hive中的函數(shù)和用法真是的豐富多彩育谬,每次摸索到了一個(gè)新用法券盅,就仿佛是在廣闊的寶山中尋得了一件新寶物。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膛檀,一起剝皮案震驚了整個(gè)濱河市锰镀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咖刃,老刑警劉巖泳炉,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嚎杨,居然都是意外死亡花鹅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門枫浙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翠胰,“玉大人,你說(shuō)我怎么就攤上這事自脯≈埃” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵膏潮,是天一觀的道長(zhǎng)锻狗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)焕参,這世上最難降的妖魔是什么轻纪? 我笑而不...
    開(kāi)封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮叠纷,結(jié)果婚禮上刻帚,老公的妹妹穿的比我還像新娘。我一直安慰自己涩嚣,他們只是感情好崇众,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布掂僵。 她就那樣靜靜地躺著,像睡著了一般顷歌。 火紅的嫁衣襯著肌膚如雪锰蓬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天眯漩,我揣著相機(jī)與錄音芹扭,去河邊找鬼。 笑死赦抖,一個(gè)胖子當(dāng)著我的面吹牛舱卡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播队萤,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灼狰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了浮禾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤份汗,失蹤者是張志新(化名)和其女友劉穎盈电,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體杯活,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匆帚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旁钧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吸重。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歪今,靈堂內(nèi)的尸體忽然破棺而出嚎幸,到底是詐尸還是另有隱情,我是刑警寧澤寄猩,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布嫉晶,位于F島的核電站,受9級(jí)特大地震影響田篇,放射性物質(zhì)發(fā)生泄漏替废。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一泊柬、第九天 我趴在偏房一處隱蔽的房頂上張望椎镣。 院中可真熱鬧,春花似錦兽赁、人聲如沸状答。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剪况。三九已至教沾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間译断,已是汗流浹背授翻。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孙咪,地道東北人堪唐。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翎蹈,于是被迫代替她去往敵國(guó)和親淮菠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354