设为首页 加入收藏

TOP

使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(一)
2015-11-21 01:27:17 来源: 作者: 【 】 浏览:2
Tags:使用 Hive Impala 执行 SQL 语句 存储 Elasticsearch 数据 操作
基础环境
CentOS-6.5
hive:hive-0.13.1+cdh5.3.6+397
impala:impala-2.1.5+cdh5.3.6+0
spark:spark-1.2.0+cdh5.3.6+379
elasticsearch:elasticsearch-1.7.1
elasticsearch-hadoop-hive:elasticsearch-hadoop-hive-2.1.1
?
Elasticsearch简介
?
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。它基于RESTful web接口,提供实时、稳定、可靠的分布式服务。
?
Elasticsearch的数据类型
?
ES使用JSON作为数据交互格式,所以简单来说,JSON支持的数据类型,ES都支持。
?
String: string?
Whole number: byte, short, integer, long?
Floating point: float, double?
Boolean: boolean?
Date: date?
除了以上Core Types(核心数据类型),还有:Array Type、Object Type、Root Object Type、Nested Type、IP Type、Geo-point Type、Geo Shap Type、Attachment Type等。
?
Solr的数据类型
相应的Solr的数据类型有:
| BCDIntField | BCDLongField | BCDStrField | BinaryField | BoolField |
| -------- | ----- | ---- |
|二进制整形字段|二进制长整形字段|二进制字符型字段|二进制数据| 包含true或者false,值的第一个字符如果是1、t、T均表示true,其他为false
|ByteField|DateField|DoubleField|ExternalFileField|FloatField
|一个字节数据|一个精确到毫秒的时间值|
|IntField|Location|LongField|Point|RandomSortField|
?
| |方位搜索用到,存经纬度值||N维点搜索,在蓝图或者CAD图中使用|不包含值,当查询时按这种类型的字段排序时会产生随机排序。使用该特性时需要是一个动态字段|
|ShortField|StrField|TextField|UUIDField
||UTF-8编码的字符串或Unicode|文本类型,一般包含多个单词或汉字|唯一识别码,单传入的值是“NEW”时,Solr将为其创建1个UUID值
?
数据存储在Elasticsearch上,使用Hive执行SQL语句
要打通Elasticsearch与Hive,需要Elasticsearch for Apache Hadoop下的elasticsearch-hadoop-hive。
?
Elasticsearch for Apache Hadoop提供了三类解决方案:Elasticsearch on YARN、repository-hdfs、elasticsearch-hadoop proper。
详情查看:Elasticsearch for Apache Hadoop。
?
创建Hive外部表
先有Hive再有Elasticsearch
?
在Elasticsearch中并无表,甚至并无Elasticsearch服务时,可以通过执行以下语句在Hive中创建一个新的外部表。
?
#在Hive中创建一个新的外部表?
hive> CREATE EXTERNAL TABLE hive_es_angel(?
? ? id ? ? ?BIGINT,?
? ? name ? ?STRING)?
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'?
TBLPROPERTIES('es.nodes'='192.168.181.190','es.resource' = 'indexname/typename');
?
这里指定了ES的地址与索引名和类型名(index-type)。通过执行此语句,便可以在Hive查看到结构正确的表。
?
注意:
elasticsearch-hadoop will always convert Hive column names to lower-case,就是说建立起的Hive表中所有字段均变为小写。
?
在执行此语句后,并不会在ElasticSearch中建立指定的索引与类型,只有当后续在Hive中执行SQL插入语句时,才会在ElasticSearch中建立指定的索引与类型,并插入相关数据。
?
执行此语句并不会抛出错误,这与HBase和Hive建立关联时的情况不一样,创建HBase外部表时需要查看HBase中信息。 更多细节可以查看《使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作》一文。
?
先有Elasticsearch再有Hive
?
在ElasticSearch中已有索引和类型,甚至在其中存储有数据时,我们可以在Hive中直接对ElasticSearch中数据进行操作。
?
即是在Hive中执行以上创建ES外部表的命令,即可以在Hue中看到ElasticSearch中的数据。
?
以下是几种典型的创建Hive外部表命令:
?
在Hive指定decimal数据类型
?
CREATE EXTERNAL TABLE hive_es_decimal(?
? ? price ? ? ?DECIMAL(12,2) )?
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'?
TBLPROPERTIES('es.nodes'='192.168.181.160','es.resource' = 'indexname/typename');
?
默认情况下,是以列名称与ES映射的,注意:elasticsearch-hadoop will always convert Hive column names to lower-case,此时ES列名也必须小写,否则映射不上。
?
经验证,以上语句有问题。如Hive定义为Decimal,而ES只能Double,会出现org.apache.hadoop.hive.serde2.io.DoubleWritable cannot be cast to org.apache.hadoop.hive.serde2.io.HiveDecimalWritable错误。
?
指定列映射关系
?
CREATE EXTERNAL TABLE hive_es_map(?
? ? price ? ? ?DOUBLE, ?
? ? itemid BIGINT,?
? ? myna
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇日期格式符RR和YY的区别 下一篇SQLite Autoincrement(自动递增)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: