hive2solr multivalue功能实现

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

id        test_s  test_ss
3       d       f d h

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

{
        "test_ss": [
          "f d h"  //识别为一个元素
        ],
        "test_s": "d",
        "id": "3",
        "_version_": 1472413953618346000
      }

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

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

     @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);
     }

更改为:

    @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);
    }

导入测试结果:

{
        "test_ss": [
          "f",
          "d",
          "h"
        ],
        "test_s": "d",
        "id": "3",
        "_version_": 1472422023801077800
      }

hive2solr multivalue功能实现,布布扣,bubuko.com

时间: 2024-10-29 12:59:29

hive2solr multivalue功能实现的相关文章

solr原子更新

最近在配合研发做ubd的项目,简单的说就是一张大宽表,有200个字段,而且数据量特别巨大(1亿级别的数据量),传统的数据库是不适合的,因此考虑基于lucene的solr,并且推荐使用solr cloud的功能来做高可用和sharding(后面会更新对solr和lucene的代码学习). 数据从hive计算插入到solr中,根据github上的代码自己做了修改,实现了hive2solr的功能.其实数据的最终插入还是调用了SolrInputDocument类的对应方法. 默认情况下对solr 添加和

solr multivalue的实现分析

线上业务准备使用solr做数据存放和索引的功能,其中有的字段要求会存入多个字,solr的field的multivalue可以实现这个功能. <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/> 下面看看其实现原理:和solr的写入document相关的两个类是Solr

C++模板常用功能讲解

前言 泛型编程是C++继面向对象编程之后的又一个重点,是为了编写与具体类型无关的代码.而模板是泛型编程的基础.模板简单来理解,可以看作是用宏来实现的,事实上确实有人用宏来实现了模板类似的功能.模板,也可以理解为模具行业的模型.根据分类,有函数模板和类模板.根据传入的不同模板参数,函数模板会生成不同模板函数.类模板则生成不同的模板类. 模板参数 1.    概念 模板定义以关键字template开始,<>中是模板参数列表(template parameter list),模板参数列表即表示可以是

采用c#实现功能1

看了好多c#的菜鸟教程不如自己开始动手打代码,最终实现了功能一,参考了网上的wordcount代码发现无论是c++还是c#大部分采用的是哈希表的方法实现的,本来还想仅用循环实现遍历句子中的所有字符,即发现"  "就total++,但是考虑到功能二的单词数变得很多,这样做时间相对来说会慢一点,因此选择了hash表来实现功能.因为仅是一个句子,所以只需要将句子中的空格split就可以了,但在解决过程中我碰到的最大问题是C:\Users\dell-pc\Desktop\wcc\wcc\Int

微信公众平台的最新功能详细介绍与使用技巧!

近日微信官方发布消息,微信公众平台的操作进行了又一次"感天动地"的更新 且听我一一道来 本次主要重要改(Geng)革(Xin)凸显在三个地方 改(Geng)革(Xin)一:图文模版的收藏与使用 这,真的是一个超级实用的功能呀,那么如何使用呢?在哪里找呢? 首先告诉大家,如何收藏图文模板 选中编辑区的部分或者全部素材,然后点击添加模版,图文模板即可收藏成功: 当然,你还可以从外部进行粘贴和复制内容到图文模版. 那么,在哪里找到我收藏的模版呢?? 嗯,就在添加图文模版的旁边啦! 同时,你还

最新版勤哲Excel服务器V2016.12.0.292无限用户支持手机APP,微信,网页等功能不绑定电脑,任意安装,支持后续升级

最新版勤哲Excel服务器V2016.12.0.292无限用户支持手机APP,微信,网页等功能不绑定电脑,任意安装,支持后续升级. 这个版本发布过之后,再发布新的版本需要到下个月的中下旬,老朋友可以使用本版本后面延续升级 目前有大约127家用户在用,没有修改过注册授权文件,系统非常成熟,推荐指数为五星,QQ:619920289 麦枫论坛http://www.mfsun.com 简介 EXCEL服务器作为一款客户化.综合性管理软件,它通过Excel就能构造出您自主的管理系统:同时,她也可将您公司现

微信JS-SDK实现上传图片功能

最近在项目开放中,有一个在微信WEB项目中上传图片的需求,一开始使用了传统的<input type="file">的方式去实现,但是后面发现在使用这种传统模式时会由于手机系统的差异而导致一系列的问题,后改用微信JSSDK的方式来实现. 总的来说,利用JSSDK来实现该功能一共分为四步. 1. 调用wx.config(),初始化jssdk的配置,并在jsApiList中配置上传图片需要的四个api('chooseImage','previewImage','uploadIma

019 添加分区功能 - bos

一.基础调整 1.删除subarea.jsp中新增窗口的分区编码一行 2.修改Subarea.hbm.xml,主键生成策略为uuid 二.easyUI - combobox下拉框的使用 1.静态页面编写(并不实用) <select class="easyui-combobox"> <option>小黑</option> <option>小白</option> <option>小红</option> &l

集成Android免费语音合成功能(在线、离线、离在线融合)

集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线)集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年没写文章了,没什么理由,就是人变懒了.囧~ 看标题,其实大家都被骗了,有这一篇文章还不够,我其实是打算分3篇文章来写的,如果合在一章里面就太长了,不过现在这个标题党横行的网络世界,我也被污染了,哈.那么为什么要分3篇文章来讲呢?看标题也能猜到了,就是在线.离线.离在线融合这3种语音合成方式,我将分别使