Hive當中實現pivot操作
阿新 • • 發佈:2018-11-02
0.背景
實際工作當中遇到這樣一個問題,資料如下,但是我想通過SQL將資料轉換成按列展示的形式,即常用的pivot透視操作。
# 原始資料
id item value
1 a 10
2 b 21
1 b 15
2 a 20
# 次級目標格式(SQL)
id itemValue
1 a-10,b-15
2 a-20,b-21
# 目標格式
id item_a item_b(SQL + Python)
1 10 15
2 20 21
在Pandas中有pivot以及pivot_table可以實現相關的功能。但是如果原始資料是在伺服器或者叢集上,將原始資料pull到本地有時是一個代價非常高的事情。並且如果可以通過sql實現pivot操作,在我們多表join的時候也會非常方便。
1.操作
需要用到的hive操作有,concat,concat_ws,collect_set,group by。
1.1 首先使用concat將item和value連線起來,concat(item, '-', value)
。
a-10
b-20
b-15
a-20
1.2 利用collect_set進行去重(因為我們是通過group by進行的資料聚合,其他欄位可能可以區分這些重複的資料,如下),並且將同屬於一個id的值形成一個set型別,方便concat_ws連線。
# 我們使用id進行group by,連線item和value會有重複,collect_set可以去掉這些重複的。 # 但是這個需要謹慎,如果other欄位也是重要的區分欄位,把other也加入到group by的欄位裡。 id item value other 1 a 10 x 1 a 10 y
1.3 使用concat_ws拼接,拼接的字元一般要和concat拼接那個不一樣。注意group by分組,這裡是group by id。也可以用多個欄位進行group by。
資料結果如下:
id itemValue
1 a-10,b-15
2 a-20,b-21
2.SQL
SELECT
id,
concat_ws(',', collect_set(concat(item, '-', value)))
FROM test_table
GROUP BY id
3.最終格式
如果想要處理成pivot table那種形式,可以拉到本地進行一些處理。這樣做的主要好處是方便和其他表進行join。
4.Reference