博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hive2solr multivalue功能实现
阅读量:6350 次
发布时间:2019-06-22

本文共 2105 字,大约阅读时间需要 7 分钟。

之前介绍了github上的hive2solr项目和solr的multivalue功能。

线上我们是采用hive计算完数据后推送到solr的方法,如果需要实现multivalue的话,默认的hive2solr是有些问题的。即使在hive中对于的field是多个字,导入solr之后也只是一个整体的字符串,比如下面表的数据如下:

1
2
id        
test_s  test_ss
3       d       f d h

其中test_ss为multivalue类型,导入solr之后:

1
2
3
4
5
6
7
8
{
        
"test_ss": [
          
"f d h"  //识别为一个元素
        
],
        
"test_s": "d",
        
"id": "3",
        
"_version_": 1472413953618346000
      
}

如果直接由hive生成数组插入solr会报array转换string失败的错误。

1
2
3
4
select 
id,test_s,split(test_ss,
' '
from 
t2;
FAILED: NoMatchingMethodException 
No 
matching method 
for 
class org.apache.hadoop.hive.ql.udf.UDFToString 
with 
(array<string>). Possible choices: _FUNC_(void)  _FUNC_(boolean)  _FUNC_(tinyint)  _FUNC_(
smallint
 
_FUNC_(
int
)  _FUNC_(
bigint
)  _FUNC_(
float
)  _FUNC_(
double
)  _FUNC_(string)  _FUNC_(
timestamp
)  _FUNC_(
decimal
)  _FUNC_(
binary
)

在hive向solr写入数据主要通过SolrWriter的write方法实现的,其最终是调用了SolrInputDocument的setField方法,可以通过更改代码为如下内容来workaround。

SolrWriter的write方法:

1
2
3
4
5
6
7
8
9
10
     
@Override
     
public 
void 
write(Writable w) 
throws 
IOException {
          
MapWritable map = (MapWritable) w;
          
SolrInputDocument doc = 
new 
SolrInputDocument();
          
for 
(
final 
Map.Entry<Writable, Writable> entry : map.entrySet()) {
               
String key = entry.getKey().toString();
               
doc.setField(key, entry.getValue().toString());  
//调用了SolrInputDocument的setField方法
          
}
          
table.save(doc);
     
}

更改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    
@Override
    
public 
void 
write(Writable w) 
throws 
IOException {
            
MapWritable map = (MapWritable ) w;
            
SolrInputDocument doc = 
new 
SolrInputDocument();
            
for 
(
final 
Map.Entry<Writable , Writable> entry : map.entrySet()) {
                    
String key = entry.getKey().toString();
                    
String value = entry.getValue().toString();
                    
String[] sl = value.split( 
"\\s+"
);  
//即把hive输入的数据通过空格分隔,切成数组(hive的sql只要concact即可)      
                    
List<String> valuesl = java.util.Arrays.asList(sl);
                    
log.info(
"add entry value lists:" 
+ valuesl);
                    
for
(String vl :valuesl){
                            
doc.addField(key,vl); 
//改为调用addFiled的方法,防止覆盖
                    
}
            
}
            
table.save(doc);
    
}

导入测试结果:

1
2
3
4
5
6
7
8
9
10
{
        
"test_ss"
: [
          
"f"
,
          
"d"
,
          
"h"
        
],
        
"test_s"
"d"
,
        
"id"
"3"
,
        
"_version_"
1472422023801077800
      
}
本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1433770,如需转载请自行联系原作者
你可能感兴趣的文章
正确理解linux grep 的姿势
查看>>
Nhibernate 使用 (一)
查看>>
【转】Android APK的数字签名的作用和意义
查看>>
C++ Primer 有感(标准库map类型)
查看>>
(23)Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
查看>>
Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框
查看>>
链表的反转
查看>>
动态从数据库获取数据(Vue.js)【数据可变】
查看>>
操作linux命令
查看>>
算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树...
查看>>
专题开发十二:JEECG微云高速开发平台-基础用户权限
查看>>
Dubbo(二) -- Simple Monitor
查看>>
java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
查看>>
给软工大二学生:用行动開始改变
查看>>
WinForm 窗口缩放动画效果
查看>>
2015年终总结
查看>>
Java 封装 HDFS API 操作
查看>>
复习C#的方法Math.Max和Math.Min
查看>>
(原创)C++11改进我们的程序之简化我们的程序(八)
查看>>
ios的@property属性和@synthesize属性
查看>>