java实现往hive 的map类型字段写数据
往hive 的map类型字段写数据
该表的该字段类型是map<string,string>
对应类的该属性的类型需要定义成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()的字符串写入字段(会有“=”,不能正确组成JSON格式的内容),也不可序列化为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(":").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<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类型呢?
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的分隔符。
导入数据时,只需要按对应分隔符处理好数据即可。
上一篇:深入理解Java反射
栏 目:JAVA代码
下一篇:详解使用MyBatis Generator自动创建代码
本文地址:http://www.codeinn.net/misctech/192918.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




