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 idname1a 2b3c 4duser address name address aadd1 aadd2 badd3 cadd4 dadd5 我們可以看到...
hive 列轉行 HQL 行轉列,列轉行
1 相關函式 concat string a col,string b col 返回輸入字串連線後的結果,支援任意個輸入字串 concat ws separator,str1,str2,它是乙個特殊形式的 concat 第乙個引數剩餘引數間的分隔符。分隔符可以是與剩餘引數一樣的字串。如果分隔符是 n...
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...