概述
环境
- 操作系统:Centos7
- 集群:CDH5.16.2
安装
-
将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类型 |
---|---|
void | null |
boolean | boolean |
tinyint | byte |
smallint | short |
int | int |
bigint | long |
double | double |
float | float |
string | string |
binary | binary |
timestamp | date |
struct | map |
map | map |
array | array |
union | 不支持 |
decimal | string |
date | date |
varchar | string |
char | string |
最后
以上就是忧心火为你收集整理的Hive集成ElasticSearch的全部内容,希望文章能够帮你解决Hive集成ElasticSearch所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复