2014-04-11 189 views
0

我有一張有四列的表。String to Map Conversion Hive

C1 C2 C3 C4 
-------------------- 
x1 y1 z1 d1 
x2 y2 z2 d2 

現在我想將它轉換爲具有鍵和值對的映射數據類型並加載到單獨的表中。

create table test 
(
    level map<string,string> 
) 
row format delimited 
COLLECTION ITEMS TERMINATED BY '&' 
map keys terminated by '='; 

現在我正在使用下面的sql來加載數據。

insert overwrite table test 
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input; 

在表上選擇查詢。

select * from test; 
{"level1":"x1","level2":"y1","level3":"z1","level4":"d1=\\"} 
{"level1":"x2","level2":"y2","level3":"z2","level4":"d2=\\"} 

我沒有得到爲什麼我得到額外的「= \ \」在最後一個值。

我仔細檢查數據,但問題仍然存在。

你能幫忙嗎?

回答

5

str_to_map(text,delimiter1,delimiter2) - 通過解析文本創建地圖 使用兩個分隔符將文本分割爲鍵值對。第一個分隔符分隔對,第二個分隔符分配鍵和值。如果只給出一個參數,則使用默認分隔符:','作爲分隔符1和'='作爲分隔符2。

可以通過運行這個命令來獲得這些信息:

describe function extended str_to_map 

在你的語法有兩個誤區:

insert overwrite table test 
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4) from input; 

首先,一個支架丟失。

二是,它不是一個錯誤,基本上,你有沒有這樣的功能正在採取默認值分隔符給出的分隔符​​,這就是爲什麼你越來越「」在結果

要獲得當前格式輸出,你應該嘗試此查詢:

insert overwrite table test 
select str_to_map(concat('level1=',c1,'&','level2=',c2,'&','level3=',c3,'&','level4=',c4),'&','=') from input; 

希望這有助於... !!!

+0

謝謝。它工作正常 - :) – jigarshah