java實(shí)現(xiàn)往hive 的map類型字段寫數(shù)據(jù)
往hive 的map類型字段寫數(shù)據(jù)
該表的該字段類型是map<string,string>
對(duì)應(yīng)類的該屬性的類型需要定義成String,不可定義成Map<String,String> ??!
方法1:
建表語句定義map的分隔符:
row format delimited fields terminated by '|' collection items terminated by ',' map keys terminated by ':' NULL DEFINED AS ''
然后在java中封裝好map后,不可直接把map.toString()的字符串寫入字段(會(huì)有“=”,不能正確組成JSON格式的內(nèi)容),也不可序列化為JSON格式的字符串后寫入字段(會(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)?。樯稙榭諘r(shí)需要把value設(shè)置成NULL?如果為空不寫時(shí),怕hive處理時(shí)出錯(cuò),可能會(huì)處理成帶四個(gè)雙引號(hào)的NULL,所以手動(dòng)指定空為"NULL"字符串)
方法2:
建表語句不用定義map的分隔符:
然后在java中封裝好map后,不可直接把map.toString()的字符串寫入字段,也不可序列化為JSON格式的字符串后寫入字段!需要自己定義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類型字段的定義與插入
map類型定義了一種kv結(jié)構(gòu),在hive中經(jīng)常使用。
如何定義map類型呢?
create table employee(id string, perf map<string, int>) ROW FORMAT DELIMITED FIELDS 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è)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實(shí)現(xiàn)配置文件自動(dòng)加載和刷新的示例詳解
在使用Spring Boot開發(fā)應(yīng)用程序時(shí),配置文件是非常重要的組成部分,在不同的環(huán)境中,我們可能需要使用不同的配置文件,當(dāng)我們更改配置文件時(shí),我們希望應(yīng)用程序能夠自動(dòng)加載和刷新配置文件,本文我們將探討Spring Boot如何實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新2023-08-08Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例
這篇文章主要介紹了Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例,當(dāng)在Spring項(xiàng)目中涉及數(shù)據(jù)庫操作時(shí),事務(wù)管理是非常重要的,它可以確保數(shù)據(jù)庫操作的一致性和完整性,Spring提供了強(qiáng)大的事務(wù)管理功能,可以通過聲明式或編程式兩種方式進(jìn)行配置,需要的朋友可以參考下2023-09-09詳談Java泛型中T和問號(hào)(通配符)的區(qū)別
下面小編就為大家?guī)硪黄斦凧ava泛型中T和問號(hào)(通配符)的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10使用Java通過OAuth協(xié)議驗(yàn)證發(fā)送微博的教程
這篇文章主要介紹了使用Java通過OAuth協(xié)議驗(yàn)證發(fā)送微博的教程,使用到了新浪微博為Java開放的API weibo4j,需要的朋友可以參考下2016-02-02

springboot 接收List 入?yún)⒌膸追N方法