hive2solr multivalue功能实现

简介:

之前介绍了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,如需转载请自行联系原作者
相关文章
|
7月前
|
SQL 分布式计算 NoSQL
使用Spark高效将数据从Hive写入Redis (功能最全)
使用Spark高效将数据从Hive写入Redis (功能最全)
444 1
|
SQL 消息中间件 监控
​实战:Flink 1.12 维表 Join Hive 最新分区功能体验
我们生产常有将实时数据流与 Hive 维表 join 来丰富数据的需求,其中 Hive 表是分区表,业务上需要关联上 Hive 最新分区的数据。上周 Flink 1.12 发布了,刚好支撑了这种业务场景,我也将 1.12 版本部署后做了一个线上需求并上线。对比之前生产环境中实现方案,最新分区直接作为时态表提升了很多开发效率,在这里做一些小的分享。
​实战:Flink 1.12 维表 Join Hive 最新分区功能体验
|
SQL 大数据 Apache
请问:hive中avg聚合函数会使用到combiner功能吗?
hive avg函数是否可以使用combiner功能
3218 0
|
8月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
218 1
|
8月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
336 0
|
3月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
81 0
|
6月前
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。