hive行轉列的函式與demo

2021-10-09 22:21:38 字數 2896 閱讀 4540

concat(string a/col, string b/col…)

返回輸入字串連線後的結果,支援任意個輸入字串;

concat_ws(separator, str1, str2,…)

它是乙個特殊形式的 concat()。第乙個引數是指定拼接的分隔符。分隔符可以是與剩餘引數一樣的字串。如果分隔符是 null,返回值也將為 null。這個函式會跳過分隔符引數後的任何 null 和空字串。分隔符將被加到被連線的字串之間;

collect_set(col)

函式只接受基本資料型別,它的主要作用是將某字段的值進行去重彙總,產生array型別字段。

collect_list : 這個函式是傳遞基本資料型別,產生array型別字段,不會去重複.collect_list和collect_set使用上基本一樣,唯一區別就是collect_list 不去重複,collect_set去了重複.

原始資料

要求格式:

把星座和血型一樣的人歸類到一起:

射手座,a 大海|鳳姐

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

白羊座,b 宋宋

準備 data2.txt

資料之間用 tab分隔

name	constellation	blood_type

孫悟空 白羊座 a

大海 射手座 a

宋宋 白羊座 b

豬八戒 白羊座 a

鳳姐 射手座 a

[root@zjj101 soft]

# cat data2.txt

孫悟空 白羊座 a

大海 射手座 a

宋宋 白羊座 b

豬八戒 白羊座 a

鳳姐 射手座 a

[root@zjj101 soft]

# pwd

/root/soft

[root@zjj101 soft]

#

cat -t 加檔名, 因為如果不是用 tab分隔的話一會兒匯入資料會匯入不了

[root@zjj101 soft]

# cat -t data2.txt

孫悟空^i白羊座^ia

大海^i射手座^ia

宋宋^i白羊座^ib

豬八戒^i白羊座^ia

鳳姐^i射手座^ia

思路,根據星座和血型,那麼就是根據這兩個欄位group by一下, 前面是星座和血型,直接concat拼接一下就可以了,後面這個是相同的星座血型的人名字拼在一起.

第一列就有了

還需要一列,那麼就用星座和血型一樣的拼接在一起. 這個過程就是行轉列了.就需要使用concat_ws函式,由於concat_ws需要入參為陣列,那麼就需要collect_set函式了

下面這種也能實現,但是不推薦,因為是子查詢,就是兩個reducetask了,效能不好

sql:

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;

函式 Hive 行轉列 和 列轉行

在hive實際開發過程中,我們會遇到 行轉列 和 列轉行 的場景。比如 1 需要取 訂單號 對應的所有商品 sku號 商品 sku號 放在一列,即從table1查詢出table2 2 當商品 sku號 均在一列的時候,需要查詢每個 sku號 對應的 訂單號 即從table2查詢出table1。實現方...

Hive函式07 行轉列 列轉行函式

concat string a col,string b col 返回輸入字串連線後的結果,支援任意個輸入字串 concat ws separator,str1,str2,它是乙個特殊形式的 concat 第乙個引數剩餘引數間的分隔符。分隔符可以是與剩 餘引數一樣的字串。如果分隔符是 null 返回...

hive中實現行轉列 Hive行轉列詳解

需求 孫悟空 白羊座 a 沙悟淨 射手座 a 宋鬆鬆 白羊座 b 豬八戒 白羊座 a 小鳳姐 射手座 a 轉換成以下格式 白羊座,a 孫悟空 豬八戒 白羊座,b 宋鬆鬆 射手座,a 沙悟淨 小鳳姐 思路 表的行轉列 知識點 concat string1,string2 string1和string2...