服务器之家

服务器之家 > 正文

java实现往hive 的map类型字段写数据

时间:2021-10-19 10:41     来源/作者:二十六画生的博客

往hive 的map类型字段写数据

该表的该字段类型是map<string,string>

对应类的该属性的类型需要定义成String,不可定义成Map<String,String> !!

方法1:

建表语句定义map的分隔符:

?
1
2
3
4
5
row format delimited
  fields terminated by '|'
  collection items terminated by ','
  map keys terminated by ':'
  NULL DEFINED AS ''

然后在java中封装好map后,不可直接把map.toString()的字符串写入字段(会有“=”,不能正确组成JSON格式的内容),也不可序列化为JSON格式的字符串后写入字段(会加很多“\”)!需要自己定义toString的方法:

?
1
2
3
4
5
6
7
8
9
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);
}

字符串是不带双引号和两端花括号的字符串,这样插入到字段时,hive会自动为key和value都添加双引号,也会在两端添加花括号!(为啥为空时需要把value设置成NULL?如果为空不写时,怕hive处理时出错,可能会处理成带四个双引号的NULL,所以手动指定空为"NULL"字符串)

方法2:

建表语句不用定义map的分隔符:

然后在java中封装好map后,不可直接把map.toString()的字符串写入字段,也不可序列化为JSON格式的字符串后写入字段!需要自己定义toString的方法:

?
1
2
3
4
5
6
7
8
9
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);
}

得到的则是正确的字段内容!

hive中默认是用“\003”分隔key与value,用“\002”分隔两个键值对!

以上是今天尝试好几种方法整理后的结论!

hive-map类型字段的定义与插入

map类型定义了一种kv结构,在hive中经常使用。

如何定义map类型呢?

?
1
2
3
4
5
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是每个kv对的分隔符,map keys是k与v的分隔符。

导入数据时,只需要按对应分隔符处理好数据即可。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://programskills.blog.csdn.net/article/details/89891843

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部