1. 程式人生 > 實用技巧 >hive函式之~行轉列與列轉行

hive函式之~行轉列與列轉行

4、行轉列

1.相關函式說明

CONCAT(string A/col, string B/col…):返回輸入字串連線後的結果,支援任意個輸入字串;

CONCAT_WS(separator, str1, str2,...):它是一個特殊形式的 CONCAT()。第一個引數剩餘引數間的分隔符。分隔符可以是與剩餘引數一樣的字串。如果分隔符是 NULL,返回值也將為 NULL。這個函式會跳過分隔符引數後的任何 NULL 和空字串。分隔符將被加到被連線的字串之間;

COLLECT_SET(col):函式只接受基本資料型別,它的主要作用是將某欄位的值進行去重彙總,產生array型別欄位。

2.資料準備

表6-6 資料準備

name

constellation

blood_type

孫悟空

白羊座

A

老王

射手座

A

宋宋

白羊座

B

豬八戒

白羊座

A

鳳姐

射手座

A

3.需求

把星座和血型一樣的人歸類到一起。結果如下:

射手座,A 老王|鳳姐

白羊座,A 孫悟空|豬八戒

白羊座,B 宋宋

4.建立本地constellation.txt,匯入資料

node03伺服器執行以下命令建立檔案,注意資料使用\t進行分割

cd /export/servers/hivedatas

vim constellation.txt

孫悟空 白羊座 A

老王 射手座 A

宋宋 白羊座 B

豬八戒 白羊座 A

鳳姐 射手座 A

6.按需求查詢資料

hive (hive_explode)> select
                        t1.base,
                        concat_ws('|', collect_set(t1.name)) name
                    from
                        (select
                            name,
                            concat(constellation, "," , blood_type) base
                        
from person_info) t1 group by t1.base;

5、列轉行

1.函式說明

EXPLODE(col):將hive一列中複雜的array或者map結構拆分成多行。

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解釋:用於和split, explode等UDTF一起使用,它能夠將一列資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。

2.資料準備

cd /export/servers/hivedatas

vim movie.txt

資料欄位之間使用\t進行分割

《疑犯追蹤》 懸疑,動作,科幻,劇情

《Lie to me》 懸疑,警匪,動作,心理,劇情

《戰狼2》 戰爭,動作,災難

3.需求

將電影分類中的陣列資料展開。結果如下:

《疑犯追蹤》 懸疑

《疑犯追蹤》 動作

《疑犯追蹤》 科幻

《疑犯追蹤》 劇情

《Lie to me》 懸疑

《Lie to me》 警匪

《Lie to me》 動作

《Lie to me》 心理

《Lie to me》 劇情

《戰狼2》 戰爭

《戰狼2》 動作

《戰狼2》 災難

4.建立hive表並匯入資料

建立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 "/export/servers/hivedatas/movie.txt" into table movie_info;

5.按需求查詢資料

select
    movie,
    category_name
from
    movie_info lateral view explode(category) table_tmp as category_name;