1. 程式人生 > >Hive當中實現pivot操作

Hive當中實現pivot操作

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

1.https://blog.csdn.net/waiwai3/article/details/79071544