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

网友投稿 801 2022-10-10


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

往hive 的map类型字段写数据

该表的该字段类型是map

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

方法1:

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

row format delimited

fields terminated by '|'

collection items terminated by ','

map keys terminated by ':'

NULL DEFINED AS ''

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

public static String insertToMap(Map map) {

StringBuilder sb = new StringBuilder();

Set 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的方法:

public static String insertToMap(Map map) {

StringBuilder sb = new StringBuilder();

Set 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类型呢?

create table employee(id string, perf map)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':';

其中fields是字段分隔符,collection是每个kv对的分隔符,map keys是k与v的分隔符。

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:完成sqlmap渗透攻击入门到实战专栏文章初步目标(sqlmap渗透网站教程)
下一篇:(CC)与(WAF)之间的较量
相关文章

 发表评论

暂时没有评论,来抢沙发吧~