使用Hive读取ElasticSearch中的数据
本文将介绍如何通过Hive来读取ElasticSearch中的数据,然后我们可以像操作其他正常Hive表一样,使用Hive来直接操作ElasticSearch中的数据,将极大的方便开发人员。本文使用的各组件版本分别为 Hive0.12、Hadoop-2.2.0、ElasticSearch 2.3.4。
我们先来看看ElasticSearch中相关表的mapping:
{ "user" : { "properties" : { "regtime" : { "index" : "not_analyzed" , "type" : "string" }, "uid" : { "type" : "integer" }, "mobile" : { "index" : "not_analyzed" , "type" : "string" }, "username" : { "index" : "not_analyzed" , "type" : "string" } } } } |
ElasticSearch中的index名为iteblog,type为user;user有regtime、uid、mobile以及username四个属性。现在我们在Hive端进行操作。
要让Hive能够操作ElasticSearch中的数据我们需要对Hive进行一些设置。值得高兴的是,ElasticSearch官方为我们提供了一些类库可以实现这些要求。我们需要引入相应的elasticsearch-hadoop-xxx.jar包,因为我们得ElasticSearch版本是2.x的,所以我们最少需要使用ES-Hadoop 2.2.x,本文使用的是elasticsearch-hadoop-2.3.4.jar,这个可以到Maven中央仓库下载。要让Hive能够加载elasticsearch-hadoop-2.3.4.jar文件有好几种方式:
1、直接通过add命令加载,如下:
hive > ADD JAR /home/iteblog/elasticsearch-hadoop-2 .3.4.jar; Added [ /home/iteblog/elasticsearch-hadoop-2 .3.4.jar] to class path Added resources: [ /home/iteblog/elasticsearch-hadoop-2 .3.4.jar] |
2、我们还可以在启动Hive的时候进行设置,如下:
$ bin /hive --auxpath= /home/iteblog/elasticsearch-hadoop-2 .3.4.jar |
3、我们还可以通过设置hive.aux.jars.path
属性来实现:
$ bin /hive -hiveconf hive.aux.jars.path= /home/iteblog/elasticsearch-hadoop-2 .3.4.jar |
或者我们把这个设置直接写到hive-site.xml
中,以便后面方便:
< property > < name >hive.aux.jars.path</ name > < value >/home/iteblog/elasticsearch-hadoop-2.3.4.jar</ value > < description >A comma separated list (with no spaces) of the jar files</ description > </ property > |
大家可以根据自己实际情况选择设置。设置好ElasticSearch相关类库之后,我们就可以到Hive中创建表了。为了方便,我们直接将Hive中各个字段以及类型设置成和ElasticSearch中一样:
hive (iteblog)> create EXTERNAL table ` user `( > regtime string, > uid int , > mobile string, > username string > ) > STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' > TBLPROPERTIES( 'es.resource' = 'iteblog/user' , 'es.nodes' = 'www.iteblog.com' , 'es.port' = '9200' , 'es.nodes.wan.only' = 'true' ); |
到这里,我们已经已经可以在Hive里面查询ElasticSearch中的数据了:
hive (iteblog)> select * from `user` limit 10; OK 2016-10-24 13:08:16 1 13112121212 Tom 2016-10-24 14:08:16 2 13112121212 Join 2016-10-25 14:23:16 3 13112121212 iteblog 2016-10-25 13:08:16 4 NULL weixin 2016-10-25 19:08:16 5 13112121212 bbs 2016-10-25 13:14:04 6 NULL zhangshan 2016-10-25 13:08:16 7 13112121212 wangwu 2016-10-25 14:56:16 8 13112121212 Joan 2016-10-25 15:25:16 9 13112121212 White 2016-10-25 17:24:16 0 NULL lihhh Time taken: 0.072 seconds, Fetched: 10 row(s) |
如上所述,我们已经成功通过Hive查询到ElasticSearch中的数据了。如果你在通过Hive查询ElasticSearch中的数据遇到如下异常:
Failed with exception java.io.IOException:org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: Cannot detect ES version - typically this happens if the network /Elasticsearch cluster is not accessible or when targeting a WAN /Cloud instance without the proper setting 'es.nodes.wan.only' |
这个很可能是因为你配置错了 es.nodes
或者 es.port
属性了。
在上面的例子中,我们为了方便将Hive中的字段设置成和ElasticSearch中一样;但实际情况下,我们可能无法将Hive中的字段和ElasticSearch保持一致,这时候我们需要在创建Hive表的时候做一些设置,否则将会出现错误。我们可以通过 es.mapping.names
参数实现,如下:
hive (iteblog)> create EXTERNAL table ` user `( > register_time string, > user_id int , > mobile string, > username string > ) > STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' > TBLPROPERTIES( 'es.resource' = 'iteblog/user' , 'es.nodes' = 'www.iteblog.com' , 'es.port' = '9200' , 'es.nodes.wan.only' = 'true' , 'es.mapping.names' = 'register_time:regtime,user_id:uid' ); |
然后我们就可以将Hive中的 register_time
映射到ElasticSearch中的 regtime
字段; user_id
映射到ElasticSearch中的 uid
字段。
在创建Hive表的时候,我们还可以通过制定 es.query
来限制需要查询的数据,如下:
hive (iteblog)> create EXTERNAL table ` user `( > regtime string, > uid int , > mobile string, > username string > ) > STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' > TBLPROPERTIES( 'es.resource' = 'iteblog/user' , 'es.nodes' = 'www.iteblog.com' , 'es.port' = '9200' , 'es.nodes.wan.only' = 'true' , 'es.query' = '?q=uid:2' ); |
上面的查询仅返回uid为2的数据(关于查询条件设置可以参见《23种非常有用的ElasticSearch查询例子(1)》),然后我们可以看效果:
hive (iteblog)> select * from `user` limit 10; OK 2016-10-24 14:08:16 2 13112121212 Join Time taken: 0.023 seconds, Fetched: 1 row(s) |
我们可以看到,uid为2的数据才返回了,其他的数据被过滤了。
在一些需要启动MapReduce任务来完成的SQL,Hive启动的Map个数和ElasticSearch中的分片个数一致,也就是每个分片使用一个Map任务来处
本文转载自过往记忆(https://www.iteblog.com/)
使用Hive读取ElasticSearch中的数据的更多相关文章
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作
http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...
- Spark读取Hbase中的数据
大家可能都知道很熟悉Spark的两种常见的数据读取方式(存放到RDD中):(1).调用parallelize函数直接从集合中获取数据,并存入RDD中:Java版本如下: JavaRDD<Inte ...
- Python中如何读取xls中的数据
要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd 安装方法:下载解压后,利用windows dos命令进入解压目录eg,c ...
- 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释
在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...
- 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots
读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots 以下为异常详细信息: Exception in thread &q ...
- sql 读取excel中的数据
select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...
- java读取请求中body数据
java读取请求中body数据 /** * 获取request中body数据 * * @author lifq * * 2017年2月24日 下午2:29:06 * @throws IOExcepti ...
- SpringBoot(十三)_springboot上传Excel并读取excel中的数据
今天工作中,发现同事在整理数据,通过excel上传到数据库.所以现在写了篇利用springboot读取excel中的数据的demo.至于数据的进一步处理,大家肯定有不同的应用场景,自行修改 pom文件 ...
随机推荐
- 对集合类的属性进行kvo观察
在进行容器对象操作时,先调用下面方法通过key或者keyPath获取集合对象,然后再对容器对象进行add或remove等操作时,就会触发KVO的消息通知了. - (NSMutableArray *)m ...
- 弱网测试之基于fiddler+wanem完成
如果不想搜集安装包,可以使用我分享的按照包,如下: WANem_3.0_Beta百度网盘下载链接:https://pan.baidu.com/s/1aMf5WBsfH7Mrl8iB2NjEYg 密码: ...
- Scala常用变量生命周期
val words = *** //在words被定义时取值 lazy val words = *** //在words被首次使用时取值 def words = *** //在每一次words被使用时 ...
- Spark快速获得CrossValidator的最佳模型参数
Spark提供了便利的Pipeline模型,可以轻松的创建自己的学习模型. 但是大部分模型都是需要提供参数的,如果不提供就是默认参数,那么怎么选择参数就是一个比较常见的问题.Spark提供在org.a ...
- 一、程序设计与C语言
@程序:用特殊的编程语言编写的代码,用于表达如何解决问题. @编程语言的作用:编程语言不是用来和计算机交谈的,而是用它来描述要求计算机如何解决问的过程或方法.计算机只能执行(懂得)机器语言. @辗转相 ...
- 【LeetCode每天一题】Reverse Integer(反转数字)
Given a 32-bit signed integer, reverse digits of an integer. Example 1: ...
- react 全局公共组件-----动态弹窗 (dialog)
react 的时候,总是会用到弹窗,并且各种各样的,一般来说,组件层级嵌套之后,就会出现 z-index层级覆盖的问题 这个时候,就需要一个公共的弹出层,然后我们将需要展示的组件,放到弹出层里面 下面 ...
- Linux系统文件目录
下面的示例是我个人的亚马逊云服务器,查看了几个关键目录的文件信息. 可以注册一个账号,免费试用一年,自己用来玩,还是很不错的 .https://aws.amazon.com/cn/ec2/ 根目录下面 ...
- 深入理解Java虚拟机2-chap3-斗之气9段
一.GC需要完成三件事 哪些内存需要回收:找出不需要使用的对象 什么时候回收:JVM空闲/堆内存紧张 如何回收:回收垃圾的策略 二.寻找已死对象:第一件事 判断对象是否存活算法 1.引用计数算法 原理 ...
- 关于bjam编译自己模块出错的问题
将这个目录下C:\Users\Regubed的user-config.jam改为下面内容 # MSVC configurationusing msvc : 9.0 ; # Python configu ...