java實(shí)現(xiàn)往hive 的map類(lèi)型字段寫(xiě)數(shù)據(jù)
該表的該字段類(lèi)型是map<string,string>
對(duì)應(yīng)類(lèi)的該屬性的類(lèi)型需要定義成String,不可定義成Map<String,String> !!
方法1:建表語(yǔ)句定義map的分隔符:
row format delimited fields terminated by ’|’ collection items terminated by ’,’ map keys terminated by ’:’ NULL DEFINED AS ’’
然后在java中封裝好map后,不可直接把map.toString()的字符串寫(xiě)入字段(會(huì)有“=”,不能正確組成JSON格式的內(nèi)容),也不可序列化為JSON格式的字符串后寫(xiě)入字段(會(huì)加很多“”)!需要自己定義toString的方法:
public static String insertToMap(Map<String, String> map) {StringBuilder sb = new StringBuilder();Set<String> set = map.keySet();for (String s : set) { sb.append(s).append(':').append(StringUtils.isBlank(map.get(s)) ? 'NULL' : map.get(s)).append(',');}String str = sb.toString();return str.substring(0, str.length() - 1); }
字符串是不帶雙引號(hào)和兩端花括號(hào)的字符串,這樣插入到字段時(shí),hive會(huì)自動(dòng)為key和value都添加雙引號(hào),也會(huì)在兩端添加花括號(hào)!(為啥為空時(shí)需要把value設(shè)置成NULL?如果為空不寫(xiě)時(shí),怕hive處理時(shí)出錯(cuò),可能會(huì)處理成帶四個(gè)雙引號(hào)的NULL,所以手動(dòng)指定空為'NULL'字符串)
方法2:建表語(yǔ)句不用定義map的分隔符:
然后在java中封裝好map后,不可直接把map.toString()的字符串寫(xiě)入字段,也不可序列化為JSON格式的字符串后寫(xiě)入字段!需要自己定義toString的方法:
public static String insertToMap(Map<String, String> map) {StringBuilder sb = new StringBuilder();Set<String> set = map.keySet();for (String s : set) { sb.append(s).append('003').append(StringUtils.isBlank(map.get(s)) ? 'NULL' : map.get(s)).append('002');}String str = sb.toString();return str.substring(0, str.length() - 1); }
得到的則是正確的字段內(nèi)容!
hive中默認(rèn)是用“003”分隔key與value,用“002”分隔兩個(gè)鍵值對(duì)!
以上是今天嘗試好幾種方法整理后的結(jié)論!
hive-map類(lèi)型字段的定義與插入map類(lèi)型定義了一種kv結(jié)構(gòu),在hive中經(jīng)常使用。
如何定義map類(lèi)型呢?create table employee(id string, perf map<string, int>) ROW FORMAT DELIMITEDFIELDS TERMINATED BY ’t’ COLLECTION ITEMS TERMINATED BY ’,’ MAP KEYS TERMINATED BY ’:’;
其中fields是字段分隔符,collection是每個(gè)kv對(duì)的分隔符,map keys是k與v的分隔符。
導(dǎo)入數(shù)據(jù)時(shí),只需要按對(duì)應(yīng)分隔符處理好數(shù)據(jù)即可。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. idea重置默認(rèn)配置的方法步驟2. idea給項(xiàng)目打war包的方法步驟3. IntelliJ IDEA設(shè)置自動(dòng)提示功能快捷鍵的方法4. IntelliJ IDEA安裝插件的方法步驟5. IntelliJ IDEA設(shè)置背景圖片的方法步驟6. idea 打包的jar運(yùn)行報(bào) "XXX中沒(méi)有主清單屬性"7. Docker 部署 Prometheus的安裝詳細(xì)教程8. idea打開(kāi)多個(gè)窗口的操作方法9. IntelliJ IDEA調(diào)整字體大小的方法10. IntelliJ IDEA刪除類(lèi)的方法步驟

網(wǎng)公網(wǎng)安備