Hive 1.2.1 行列轉(zhuǎn)換

1. 借鑒

Hive_語法_行列轉(zhuǎn)換

2. 開始

行轉(zhuǎn)列

相關(guān)函數(shù)
  • CONCAT(string A/col, string B/col…)
    返回輸入字符串連接后的結(jié)果失乾,支持任意個輸入字符串;
  • CONCAT_WS(separator, str1, str2,...)
    它是一個特殊形式的 CONCAT()碾盐。第一個參數(shù)表示參數(shù)間的分隔符邮利。如果分隔符是 NULL芹缔,返回值也將為 NULL。這個函數(shù)會跳過分隔符參數(shù)后的任何 NULL 和空字符串吮炕。分隔符將被加到被連接的字符串之間歧蒋。只能拼接字符串類型
  • COLLECT_SET(col)
    聚合函數(shù),函數(shù)只接受基本數(shù)據(jù)類型咪惠,它的主要作用是將某字段的值進行去重匯總击吱,產(chǎn)生array類型字段。
  • COLLECT_LIST(col)
    聚合函數(shù)遥昧,函數(shù)只接受基本數(shù)據(jù)類型覆醇,產(chǎn)生array類型字段
數(shù)據(jù)準(zhǔn)備

db_company.company 數(shù)據(jù)下載
表如下:

# 列注釋
# id          主鍵
# name,      產(chǎn)品名稱
# code炭臭,      企業(yè)code
# dimension   領(lǐng)域
# score       分?jǐn)?shù)
create external table db_company.company
(
id bigint,
name string,
code string,
dimension string,
score bigint
)
row format delimited
fields terminated by ',';

加載數(shù)據(jù):

load data local inpath '/opt/envs/datas/company/company.txt' into table db_company.company;
CONCAT

拼接字符串

  • 查詢小米旗下分類和名稱永脓,以:分隔
select concat(dimension, ':', name) from db_company.company where code = '35462360';

結(jié)果如下

商標(biāo):小米 Play
商標(biāo):小米 Plus
商標(biāo):小米
專利:小米掛面
專利:小米紅棗粥
CONCAT_WS

拼接字符串,只能輸入字符串

  • 查詢分類鞋仍,名稱和分?jǐn)?shù)常摧,以:分隔
    這里我們的score是bigint類型,會出現(xiàn)以下錯誤:
select concat_ws(':', dimension, name, score) from db_company.company where code = '35462360';

錯誤提示

FAILED: SemanticException [Error 10016]: Line 1:39 Argument type mismatch 'score': Argument 4 of function CONCAT_WS must be "string or array<string>", but "bigint" was found.

正確的姿勢如下:

select concat_ws(':', dimension, name, cast(score as string)) from db_company.company where code = '35462360';

查詢結(jié)果如下:

商標(biāo):小米 Play:5
商標(biāo):小米 Plus:3
商標(biāo):小米:3
專利:小米掛面:3
專利:小米紅棗粥:3
COLLECT_SET
  • ① 獲得名字的數(shù)組

      select collect_set(name) from company;
    

    結(jié)果如下:

    ["小米 Play","小米 Plus","小米","至信","中勝","信用通行證","小米掛面","小米紅棗粥","至信圖像"]
    
  • ② 將 ① 中獲得名字以 | 分隔

     select concat_ws('|', collect_set(name)) from company;
    

    結(jié)果如下:

    小米 Play|小米 Plus|小米|至信|中勝|(zhì)信用通行證|小米掛面|小米紅棗粥|至信圖像
    
  • ③ 查詢每個企業(yè)威创,不同領(lǐng)域下的產(chǎn)品的名稱落午,以,分隔

    我們需要的是下面的數(shù)據(jù)

    35462360:商標(biāo)   小米 Play,小米 Plus,小米
    35462361:商標(biāo)   至信,中勝,信用通行證
    35462360:專利   小米掛面,小米紅棗粥
    35462361:專利   至信圖像
    

    第一步:拼接第一列

    select concat(code, ':', dimension), name
    from company;
    

    獲得以下數(shù)據(jù)

    35462360:商標(biāo)   小米 Play
    35462360:商標(biāo)   小米 Plus
    35462360:商標(biāo)   小米
    35462361:商標(biāo)   至信
    35462361:商標(biāo)   中勝
    35462361:商標(biāo)   信用通行證
    35462360:專利   小米掛面
    35462360:專利   小米紅棗粥
    35462361:專利   至信圖像
    

    第二步:分組

    select t1.code_dimension, concat_ws(',', collect_set(t1.name))
    from
    (
      select concat(code, ':', dimension) as code_dimension, name
      from company
    ) as t1
    group by code_dimension;
    

    結(jié)果如下:

    35462360:專利   小米掛面,小米紅棗粥
    35462360:商標(biāo)   小米 Play,小米 Plus,小米
    35462361:專利   至信圖像
    35462361:商標(biāo)   至信,中勝,信用通行證
    

列轉(zhuǎn)行

相關(guān)函數(shù)
  • SPLIT(string str, string pattern)
    按照pattern字符串分割str,會返回分割后的字符串?dāng)?shù)組
  • EXPLODE(col)
    將array或者map結(jié)構(gòu)拆分成多行肚豺。
  • LATERAL VIEW
    用于和split, EXPLODE等UDTF一起使用溃斋,它能夠?qū)⒁涣袛?shù)據(jù)拆成多行數(shù)據(jù),在此基礎(chǔ)上可以對拆分后的數(shù)據(jù)進行聚合吸申。
數(shù)據(jù)準(zhǔn)備

db_movie.movie_douban 數(shù)據(jù)下載
表如下:

create database db_movie;
use db_movie;
create external table db_movie.movie_douban
(
name string,
tag array<string>,
country string
)
row format delimited
fields terminated by ','
collection items terminated by '/';

加載數(shù)據(jù):

load data local inpath '/opt/envs/datas/movie/movie.txt' into table db_movie.movie_douban;
SPLIT

注意這里split輸出兩個字符串類型梗劫,而我們的tag是array類型,所以這里我們做一個沒有意義的測試截碴。

select split(concat_ws(',', tag), ',')
from db_movie.movie_douban;

根據(jù)結(jié)果我們會發(fā)現(xiàn)它跟直接查詢tag字段是一樣的梳侨。

["犯罪","劇情"]
["劇情","愛情"]
["劇情","犯罪","懸疑"]
["劇情","歌舞"]
["劇情","愛情"]
["劇情","喜劇","愛情","戰(zhàn)爭"]
["劇情","歷史","戰(zhàn)爭"]
["劇情","歷史"]
["劇情","犯罪","懸疑"]
["劇情","犯罪","懸疑"]
["劇情","動作","犯罪"]
["劇情","動畫","奇幻"]
["劇情","愛情","災(zāi)難"]
["劇情"]
EXPLODE
  • 查看電影總共有多少個分類
    這里為了好看,我也將列轉(zhuǎn)行了日丹,看官在試的時候可以去掉最外層查詢
    select concat_ws(' ', collect_set(t2.name))
    from
    (
        select distinct t.name as name from (select explode(tag) as name from   db_movie.movie_douban) as t
    ) as t2;
    
    結(jié)果如下:
    劇情 動作 動畫 歷史 喜劇 奇幻 懸疑 戰(zhàn)爭 歌舞 災(zāi)難 愛情 犯罪
    
LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
udtf:目前我們知道有split和explode
tableAlias:表別名
columnAlias:列別名

  • ① 將分類數(shù)據(jù)展開成以下
    name    tag_category
    肖申克的救贖    犯罪
    肖申克的救贖    劇情
    霸王別姬        劇情
    霸王別姬        愛情
    控方證人        劇情
    控方證人        犯罪
    控方證人        懸疑
    伊麗莎白        劇情
    伊麗莎白        歌舞
    阿甘正傳        劇情
    阿甘正傳        愛情
    美麗人生        劇情
    美麗人生        喜劇
    美麗人生        愛情
    美麗人生        戰(zhàn)爭
    辛德勒的名單    劇情
    辛德勒的名單    歷史
    辛德勒的名單    戰(zhàn)爭
    茶館           劇情
    茶館           歷史
    控方證人        劇情
    控方證人        犯罪
    控方證人        懸疑
    十二怒漢        劇情
    十二怒漢        犯罪
    十二怒漢        懸疑
    這個殺手不太冷   劇情
    這個殺手不太冷   動作
    這個殺手不太冷   犯罪
    千與千尋        劇情
    千與千尋        動畫
    千與千尋        奇幻
    泰坦尼克號      劇情
    泰坦尼克號      愛情
    泰坦尼克號      災(zāi)難
    忠犬八公的故事   劇情
    
    別看好像挺簡單走哺,犯難了吧。這里我們可以一步到位
    select name, tag_category
    from db_movie.movie_douban
    lateral view explode(tag) table_tmp as tag_category;
    
  • ② 查詢每種類型的電影
    select t.tag_category, concat_ws(',', collect_set(t.name))
    from
    (
        select name, tag_category
        from db_movie.movie_douban
        lateral view explode(tag) table_tmp as tag_category
    ) as t
    group by tag_category;
    
    結(jié)果如下哲虾,是不是有點意思割坠,一開始我們的是以電影維度統(tǒng)計的電影的標(biāo)簽,現(xiàn)在我們以標(biāo)簽維度統(tǒng)計電影
    劇情    肖申克的救贖,霸王別姬,控方證人,伊麗莎白,阿甘正傳,美麗人生,辛德勒的名單,茶館,十二怒漢,這個殺手不太冷,千與千尋,泰坦尼克號,忠犬八公的故事
    動作    這個殺手不太冷
    動畫    千與千尋
    歷史    辛德勒的名單,茶館
    喜劇    美麗人生
    奇幻    千與千尋
    懸疑    控方證人,十二怒漢
    戰(zhàn)爭    美麗人生,辛德勒的名單
    歌舞    伊麗莎白
    災(zāi)難    泰坦尼克號
    愛情    霸王別姬,阿甘正傳,美麗人生,泰坦尼克號
    犯罪    肖申克的救贖,控方證人,十二怒漢,這個殺手不太冷
    

3. 大功告成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妒牙,一起剝皮案震驚了整個濱河市彼哼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湘今,老刑警劉巖敢朱,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡拴签,警方通過查閱死者的電腦和手機孝常,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚓哩,“玉大人构灸,你說我怎么就攤上這事“独妫” “怎么了喜颁?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長曹阔。 經(jīng)常有香客問我半开,道長,這世上最難降的妖魔是什么赃份? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任寂拆,我火速辦了婚禮,結(jié)果婚禮上抓韩,老公的妹妹穿的比我還像新娘纠永。我一直安慰自己,他們只是感情好谒拴,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布渺蒿。 她就那樣靜靜地躺著,像睡著了一般彪薛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怠蹂,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天善延,我揣著相機與錄音,去河邊找鬼城侧。 笑死易遣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嫌佑。 我是一名探鬼主播豆茫,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屋摇!你這毒婦竟也來了揩魂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炮温,失蹤者是張志新(化名)和其女友劉穎火脉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡倦挂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年畸颅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片方援。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡没炒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犯戏,到底是詐尸還是另有隱情送火,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布笛丙,位于F島的核電站漾脂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胚鸯。R本人自食惡果不足惜骨稿,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姜钳。 院中可真熱鬧坦冠,春花似錦、人聲如沸哥桥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拟糕。三九已至判呕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送滞,已是汗流浹背侠草。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犁嗅,地道東北人边涕。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像褂微,于是被迫代替她去往敵國和親功蜓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355