hive行轉列 列轉行復雜函數實操


hive行轉列 列轉行復雜函數實操


行轉列

1.相關函數說明

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

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

COLLECT_SET(col):函數只接受基本數據類型,它的主要作用是將某字段的值進行去重彙總,產生array類型字段。

2.數據準備


hive行轉列 列轉行復雜函數實操

3.需求

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

射手座,A 老王|鳳姐

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

白羊座,B 宋宋

4.創建本地constellation.txt,導入數據

node1服務器執行以下命令創建文件,注意數據使用\\t進行分割

cd /export/service/hive-2.3.0/tmpData

vim constellation.txt

孫悟空 白羊座 A

老王 射手座 A

宋宋 白羊座 B

豬八戒 白羊座 A

鳳姐 射手座 A

5.創建hive表並導入數據

創建hive表並加載數據

hive (hive_explode)> create table person_info(

name string,

constellation string,

blood_type string)

row format delimited fields terminated by "\\t";

加載數據

hive (hive_explode)> load data local inpath '/export/service/hive-2.3.0/tmpData/constellation.txt' into table person_info;

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;

列轉行

1.函數說明

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

LATERAL VIEW

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

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

2.數據準備

cd /export/service/hive-2.3.0/tmpData

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/service/hive-2.3.0/tmpData/movie.txt" into table movie_info;/<string>

5.按需求查詢數據

select

movie,

category_name

from

movie_info lateral view explode(category) table_tmp as category_name;



分享到:


相關文章: