es与hive整合
在hive classpath中添加elasticsearch-hadoop.jar,以下方法任一种均可:
1、启动hiveserver2 前,在hive-site.xml文件中更改hive.aux.jars.path属性值
<property>
<name>hive.reloadable.aux.jars.path</name>
<value>/path/elasticsearch-hadoop.jar</value>
<description>A comma separated list (with no spaces) of the jar files</description>
</property>
2、启动hiveserver2 时,指定hive.reloadable.aux.jars.path属性值
nohup hive --service hiveserver2 --hiveconf hive.reloadable.aux.jars.path=/path/elasticsearch-hadoop.jar &
3、启动hiveserver2 后,在hive 命令行中执行add jar /path/elasticsearch-hadoop.jar; 命令。
实测,以上三种方法,前两种方法中jar包的路径必须是本地路径,第三种方法中的路径既可以是本地路径,也可以是hdfs路径。
配置
hive在建表时,创建external表,并使用tblproperties指定一些es相关的属性
create external table artists (...)
stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
tblproperties('es.nodes' = 'linux-node9:9200', 'es.resource' = 'artists/_doc', 'es.index.auto.create' = 'false', 'es.index.read.missing.as.empty' = 'false');
org.elasticsearch.hadoop.hive.EsStorageHandler 是elasticsearch-hadoop.jar中的类,所以从这里就可以看出,确实是需要elasticsearch-hadoop.jar,而该jar在$HIVE_HOME/lib 下是没有的,所以需要外部添加。从该jar的groupId可以看出,jar包维护者是ES公司,所以不可能预装在hive安装包中。
es.nodes指定es集群地址
es.resource指定关联的index及其type
es.index.auto.create表示在表插入数据的时候,如果索引还没有建,是否自动创建索引。强烈建议不要自动创建索引,因为自动创建索引时会自动映射字段类型,而hive字段类型和es字段类型不是一一对应的,如果自动映射字段类型的话,在hive查询表数据的时候很可能会报类型转换错误。
es.index.read.missing.as.empty表示当索引不存在时,在hive查询表数据时是否报错。为true则不报错,为false时会报错。
映射
默认情况下,elasticsearch-hadoop 使用hive表的字段名和类型映射es中的数据。但有些情况下,在hive中可以使用的名称在es中不能使用,比如一些es的关键字。对于这种情况,可以在建hive表时指定es.mapping.names属性,值是以逗号分隔的映射名称列表,映射格式是hive字段名称:es字段名称。如下:
create external table artists (...)
stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
tblproperties('es.nodes' = 'linux-node9:9200', 'es.resource' = 'artists/_doc', 'es.mapping.names' = 'date:@timestamp , url:url_123 ');
上例中,hive外部表artists的date列、url列分别对应es中artists索引的@timestamp字段、url_123字段。
hive不区分大小写,但是es区分。为了避免列名大小写对不上造成的信息丢失,elasticsearch-hadoop会将hive列名称全转为小写。
写数据到es
操作这个hive外部表就可对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' = 'artists/_doc');
从另一个hive表source查询数据并将结果集插入到es中
insert overwrite table artists select null, s.name, named_struct('url', s.url, 'picture', s.picture) from source s;
假如要指定es 文档的id,则可以用tblproperties(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中
对于输入数据是json的情况,es-hadoop允许直接索引而不应用任何转换,数据按原样直接发送给es。在这种情况下,需要使用tblproperties(es.input.json)属性,es-hadoop期望输出表只包含一个字段,字段类型是string/varchar(如果json数据是字符串表示的话)或者是binary(如果json数据是byte[]的话),字段值就是json数据。建表语句如下:
create external table json (data string)
stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
tblproperties('es.resource' = '...', 'es.input.json` = 'yes');
从es读取
在建表时可以指定从es读的查询语句,这样表的数据就是查询结果。如下:
create external table artists (
id bigint,
name string
)
stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
tblproperties('es.resource' = 'artists/_doc', 'es.query' = '?q=me*');
es.query的值即是查询语句。
类型转换
Hive type | Elasticsearch type |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在es中创建索引时,需根据以上表格指定映射类型。
需要知道的是,如果一个hive表在建表时关联了es,则表数据其实是放在es数据目录中的,而且该hive 表不能被truncate,会报Cannot truncate non-native table artists 错误,但是可以被drop。表drop之后,es中索引不会受影响,数据也不会被删除,只有建表时location指定的目录会被删除,如果没有使用location 关键字,则会删除hive.metastore.warehouse.dir 指定的目录中的数据库名目录中的表名目录。如果再按照原来表定义语句重建表,则查询该表还是可以正常查出数据的,就好像表没有被drop 过一样。
疑问三:表或索引字段的新增、删除如何影响对方?
不会影响对方。
关联es的hive表,在建好后是不能添加或者删除字段的,会报ALTER TABLE cannot be used for a non-native table artists 错误。
es索引可以新增字段,但是这个字段永远不会有值,因为关联es的hive表新增不了字段,故es索引中这个字段不会有有效值插入。
es索引不能删除字段。
es与hive整合的更多相关文章
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- 大数据学习系列之九---- Hive整合Spark和HBase以及相关测试
前言 在之前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,但是在使用hive进行数据查询的时候会非常的慢,因为h ...
- hive整合hbase
Hive整合HBase后的好处: 通过Hive把数据加载到HBase中,数据源可以是文件也可以是Hive中的表. 通过整合,让HBase支持JOIN.GROUP等SQL查询语法. 通过整合,不仅可完成 ...
- 四 Hive整合HBase
安装环境: hbase版本:hbase-1.4.0-bin.tar.gz hive版本: apache-hive-1.2.1-bin.tar 注意请使用高一点的hbase版本,不然就算hive和h ...
- 创建hive整合hbase的表总结
[Author]: kwu 创建hive整合hbase的表总结.例如以下两种方式: 1.创建hive表的同步创建hbase的表 CREATE TABLE stage.hbase_news_compan ...
- Hbase与hive整合
//hive与hbase整合create table lectrure.hbase_lecture10(sname string, score int) stored by 'org.apache.h ...
- 安装hue及hadoop和hive整合
环境: centos7 jdk1.8.0_111 Hadoop 2.7.3 Hive1.2.2 hue-3.10.0 Hue安装: 1.下载hue-3.10.0.tgz: https://dl.dro ...
- Hive 整合Hbase
摘要 Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询.同时也可以将hive表中的数据映射到Hbase中. 应用 ...
- Hbase 与Hive整合
HBase与Hive的对比 25.1.Hive 25.1.1.数据仓库 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询. 25.1.2. ...
随机推荐
- Centos7下安装与卸载Jdk1.8
安装 去官网下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 使用xs ...
- Java SimpleDateFormat用法
? Java中怎么才能把日期转换成想要的格式呢,或把字符串转换成一定格式的日期,如把数据库中的日期或时间转换成自己想要的格式,JAVA中提供了SimpleDateFormat类可以实现,以下是Si ...
- 通过面试题学习零散知识:Java面试题整理
一.如何看待面试题 对于喜欢学习的开发者来说,我们抛开工作和生活的时间,剩余的时间并不多,如果都用于学习的话,也不可能学的下所有感兴趣的技术点,精力也跟不上,我是深感如是.而面试题一般都是零碎的知识 ...
- Smart3d和3dsmax结合做人脸建模
1.拍摄几张照片(或视频 我是拍摄的视频然后截图,因为自拍照20张总是不方便) 2.导入smart3d 3.空三匹配 4.重建,并保存格式为.obj常用格式 5.将上一步重建的结果导入3dsmax做进 ...
- 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Excepti ...
- Understanding sun.misc.Unsafe
转自: https://dzone.com/articles/understanding-sunmiscunsafe The biggest competitor to the Java virtua ...
- 浅析Java语言慢的原因
Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论.我想就我自己的理解,谈一下影响Java ...
- 【微服务架构】SpringCloud之Ribbon(四)
一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接 ...
- jmeter - 命令行方式运行
命令格式: jmeter -n -t <testplan filename> -l <listener filename> 参数说明: -n 非 GUI 模式 -> 在非 ...
- Linq实战 之 DataSet操作详解
Linq实战 之 DataSet操作详解 一:linq to Ado.Net 1. linq为什么要扩展ado.net,原因在于给既有代码增加福利.FCL中在ado.net上扩展了一些方法. 简单一 ...