hive 列轉行和行轉列

2021-07-08 12:52:02 字數 2406 閱讀 2190

1. 假設我們在hive中有兩張表,其中一張表是存使用者基本資訊,另一張表是存使用者的位址資訊等,表資料假設如下:

user_basic_info:

idname1a

2b3c

4duser_address;

name

address

aadd1

aadd2

badd3

cadd4

dadd5

我們可以看到同乙個使用者不止乙個位址(這裡是假設的),我們需要把資料變為如下格式:

idname

address1a

add1,add22b

add33c

add44d

add5

collect_set

這就用到了hive中的行轉列的知識,需要用到兩個內建udf: collect_set, concat_ws,

兩個函式解釋如下見:

建表:[sql]view plain

copy

create

table

user_basic_info(id string, 

name

string);  

create

table

user_address(

name

string, address string);  

載入資料:

[sql]view plain

copy

load

data 

local

inpath 

'/home/jthink/work/workspace/hive/row_col_tran/data1'

into

table

user_basic_info;  

load

data 

local

inpath 

'/home/jthink/work/workspace/hive/row_col_tran/data2'

into

table

user_address;  

執行合併:

[sql]view plain

copy

select

max(ubi.id), ubi.

name

, concat_ws(

',', collect_set(ua.address)) 

asaddress 

from

user_basic_info ubi 

join

user_address ua 

onubi.

name

=ua.

name

group

byubi.

name

;  

執行結果:

1       a       add1,add2

2       b       add3

3       c       add4

4       d       add5

2. 假設我們有一張表:

user_info:

idname

address1a

add1,add22b

add33c

add44d

add5

我們需要拆分address,變為:

idname

address1a

add11a

add22b

add33c

add44d

add5

我們很容易想到用udtf,explode():

select explode(address) as address from user_info;

這樣執行的結果只有address, 但是我們需要完整的資訊:

select id, name, explode(address) as address from user_info;

這樣做是不對的, udtf's are not supported outside the select clause, nor nested in expressions

所以我們需要這樣做:

select id, name, add from user_info ui lateral view explode(ui.address) adtable as add;

結果為:

1       a       add1

1       a       add2

2       b       add3

3       c       add4

4       d       add5

hive 列轉行和行轉列

1.假設我們在hive中有兩張表,其中一張表是存使用者基本資訊,另一張表是存使用者的位址資訊等,表資料假設如下 user basic info id name1a 2b3c 4duser address name address aadd1 aadd2 badd3 cadd4 dadd5 id na...

Hive行轉列和列轉行

優點 好理解 缺點 多次select同一張表,造成計算量成倍增加 冗餘,單個select條件複雜後會變得較難維護。concat height height,weight weight,age age as value select id,height as label,height as value...

Hive行轉列,列轉行

下面舉兩個例子 例一 行轉列 資料 a b 1 a c 2 a b 3 c d 4 c d 5 c d 6 轉化為 a b 1,2,3 c d 4,5,6 創表hive create table test1 col1 string,col2 string,col3 string row format...