我是靠谱客的博主 忧心火,最近开发中收集的这篇文章主要介绍Hive集成ElasticSearch,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

环境

  1. 操作系统:Centos7
  2. 集群:CDH5.16.2

安装

  1. 将elasticsearch-hadoop.jar添加到hive的classpath路径中

    方法1(此方法支持HDFS路径)

    add jar /path/elasticsearch-hadoop.jar;

    方法2(使用配置)

    bin/hive -hiveconf hive.aux.jars.path=/path/elasticsearch-hadoop.jar

    方法3(使用hive-site.xml配置文件)

    <property>
      <name>hive.aux.jars.path</name>
      <value>/path/elasticsearch-hadoop.jar</value>
      <description>A comma separated list (with no spaces) of the jar files</description>
    </property>
    

创建表

CREATE EXTERNAL TABLE artists (...)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists',
              'es.index.auto.create' = 'false');

映射

默认使用Hive的表schema映射Es中的数据(使用对应的列名和类型),但是可能
存在在hive中可使用的名字,但是在Es中不可使用,这种情况下,可以使用es.mapping.names参数进行映射,格式如下:Hive field name: ElasticSearch field name

CREATE EXTERNAL TABLE artists (...)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists',
            'es.mapping.names' = 'date:@timestamp, url:url_123'); 

上面的例子是:Hive中的date列映射到Es中的@timestamp,Hive中的Url列映射到Es中的url_123

事项:

1、Hive是大小写不敏感,但是Es是大小写敏感,elasticsearch-hadoop会转换Hive列到小写,所以,尽量使用小写列名。
2、Hive将丢失的值设置为NULL值,要在Es中进行测试,看看是否满足查询条件

写入数据到Es

CREATE EXTERNAL TABLE artists (
    id      BIGINT,
    name    STRING,
    links   STRUCT<url:STRING, picture:STRING>)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists'); 

-- insert data to Elasticsearch from another table called 'source'
INSERT OVERWRITE TABLE artists
    SELECT NULL, s.name, named_struct('url', s.url, 'picture', s.picture)
                    FROM source s;

有时需要设置Es中文档的ID,可是用es.mapping.id参数进行设置。例如,Hive的id作为Es中文档的ID。

CREATE EXTERNAL TABLE artists (
    id      BIGINT,
    ...)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.mapping.id' = 'id'...);

写入Json数据到Es

CREATE EXTERNAL TABLE json (data STRING) 
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = '...',
              'es.input.json` = 'yes'); 
  • 表仅仅申明一个String类型
  • es.input.json表示json格式

写到动态/多资源

CREATE EXTERNAL TABLE media (
    name    STRING,
    type    STRING,
    year    STRING,
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'my-collection-{type}/doc'); 
  • 表示使用字段type来区分资源
    这种方法也可以应用到Json格式
{
    "media_type":"music",
    "title":"Surfing With The Alien",
    "year":"1987"
}
CREATE EXTERNAL TABLE json (data STRING) 
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'my-collection-{media_type}/doc', 
              'es.input.json` = 'yes');

从Es读取数据

CREATE EXTERNAL TABLE artists (
    id      BIGINT,
    name    STRING,
    links   STRUCT<url:STRING, picture:STRING>)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'radio/artists', 
              'es.query' = '?q=me*');          

-- stream data from Elasticsearch
SELECT * FROM artists;

类型转换

Hive类型ElasticSearch类型
voidnull
booleanboolean
tinyintbyte
smallintshort
intint
bigintlong
doubledouble
floatfloat
stringstring
binarybinary
timestampdate
structmap
mapmap
arrayarray
union不支持
decimalstring
datedate
varcharstring
charstring

最后

以上就是忧心火为你收集整理的Hive集成ElasticSearch的全部内容,希望文章能够帮你解决Hive集成ElasticSearch所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部