Hive當中實現pivot操作

2021-08-26 14:55:23 字數 1570 閱讀 9380

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.

HIVE實現pivot函式

pivot是乙個非常實用的函式 pivot的格式 select 原表字段1,2,3 from 表名 as 原表別名 pivot 聚合函式 原表字段1 for 原表字段2 in 原表2值1 原表字段2值2 as 新錶別名 但是hive裡面沒有自帶pivot函式,所以我們需要自己實現 首先建立一組資料 ...

HIVE當中的關聯查詢

在hive中沒有外來鍵和主鍵之分。但是可以進行多表關聯查詢 值關聯 只要這兩個值相等就可以作為關聯條件,其實在mysql中也是支援。mysql中的關聯查詢 left join 左連線 right join 右連線 innerjoin 全連線 內連線 t user id name 1 zs 2 ls ...

在hue當中設定hive當中資料庫的控制許可權

這段時間在搞大資料的集群搭建工作,並且安裝了hive的服務,但是沒有對其中的資料庫的操作許可權做限制,每個人都可以對資料庫進行增刪改查。今天有空做了一下了對hive資料庫當中的資料庫做一些限制。我們都是在hue的客戶端進行操作hive當中的資料庫。操作如下 1 在hue介面建立登入使用者 2 配置h...