hive中行轉列,列轉行的場景及實現

2021-09-17 18:26:55 字數 2844 閱讀 7219

hive行轉列,列轉行的應用場景:

1、 需要取「訂單號」對應的所有商品「sku號」,商品「sku號」放在一列,即從table1查詢出table2;

2、 當商品「sku號」均在一列的時候,需要查詢每個「sku號」對應的「訂單號」,即從table2查詢出table1。

3、場景:在hive表中,乙個使用者會有多個人群標籤,list格式(逗號分隔如要轉成list),有時我們需要統計乙個人群標籤下有少使用者,這是就需要使用行轉列。

示例如下:(場景一,場景二)

實現方法:

1、從table1查詢出table2:

select sale_ord_id, concat_ws(',', collect_set(item_sku_id)) as item_sku_id

from table1

where dt = sysdate(-1)

group by sale_ord_id

關鍵點:concat_ws()  、 collect_set() 函式的使用

2、從table2查詢出table1:

select sale_ord_id, sku_id

from table2

lateral view explode(split(item_sku_id, ',')) adtable as sku_id

where dt = sysdate(-1)

關鍵點:explode()、split() 和 lateral view  函式 的使用

3、例如,user_crowd_info有如下資料(場景三)

visit_id    crowds

abc         [100,101,102]

def         [100,101]

abe         [101,105]

處理加工方法:

select explode(crowds) as crowd from user_crowd_info;

結果:100

101102

100101

101105

這樣執行的結果只有crowd, 但是我們需要完整的資訊,使用下面的sql

select visit_id, crowd

from user_crowd_info t

lateral view explode(t.crowds) adtable as crowd;

如果你寫了select visit_id, explode(crowds) as crowd from user_crowd_info;這種是不行的哦。

列轉行的話比較簡單,使用concat_ws函式即可,如下表

select visit_id,concat_ws(,crowd) from user_crowd_info group by visit_id;

下面再舉個程式猿的專門測試功能的測試用例情況:

需求:通過上面的資料,轉換成下面格式的資料,如何操作?

a       b       1

a       b       2

a       b       3

c       d       4

c       d       5

c       d       6

變為:a       b       1,2,3

c       d       4,5,6

mock資料,組裝表

drop table if exists test;

create table test(

col1 string,

col2 string,

col3 string

)row format delimited fields terminated by '\t'

stored as textfile;

load data local inpath '/home/zhang/test.txt' into table test;

操作:select col1, col2

, concat_ws(',', collect_set(col3))

from test

group by col1, col2;

通過上面的資料,轉換成下面格式的資料,如何操作?

a       b       1,2,3

c       d       4,5,6

變為:a       b       1

a       b       2

a       b       3

c       d       4

c       d       5

c       d       6

mock資料,組裝表

drop table if exists test2;

create table test2

(col1 string,

col2 string,

col3 string

)row format delimited fields terminated by '\t'

stored as textfile;

操作:select col1, col2, col5

from test2 a

lateral view explode(split(col3, ',')) b as col5

ok,就到這裡了...下次抽空整理下hive的視窗函式...

hive中行轉列 列轉行的實現

行轉列實現 表資訊 場景一 使用concat ws和collect set函式 說明 collect set函式可以返回乙個array型別。concat ws函式可以拼接陣列,如下 場景二 有時候如果需要對指標字段求和,則上述sql改寫成如下 場景三 使用str to map和explode函式以及...

SQL Server 中行轉列 列轉行

行轉列 create database test on primary name test.mdf filename d project test.mdf size 10mb,filegrowth 15 log on name test.ndf filename d project test.ldf...

SQL中行轉列 列轉行

sql行轉列 列轉行 這個主題還是比較常見的,行轉列主要適用於對資料作聚合統計,如統計某類目的商品在某個時間區間的銷售情況。整理測試資料 create table wyc test id int 32 not null auto increment name varchar 80 default n...