通过Hive将数据从HDFS索引到Elasticsearch

时间:2015-07-16 13:15:59

标签: hadoop elasticsearch hive elasticsearch-plugin

我正在使用Elasticsearch for Hadoop插件,以便通过Hive读取Elasticsearch中的文档并将其编入索引。

我按照此页面中的文档操作: https://www.elastic.co/guide/en/elasticsearch/hadoop/current/hive.html

为了使用Hadoop索引Elasticsearch中的文档,您需要在Hive中创建一个配置正确的表。 我在将数据插入该hive表时遇到了问题。

这是用于创建的表格的写作脚本:

CREATE EXTERNAL TABLE es_names_w
(
 firstname string,
 lastname string
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'hive_test/names', 'es.index.auto.create' = 'true')

然后我尝试插入数据:

INSERT OVERWRITE TABLE es_names_w
SELECT firstname,lastname
FROM tmp_names_source;

我从蜂巢获得的错误是: “作业提交失败,异常'org.apache.hadoom.ipc.RemoteExaption(java.lang.RuntimeExeption:org.xml.sax.SAXParseException; systemId:file:////hdfs_data/mapred/jt/jobTracker/job_201506091622_0064.xml ; lineNunber:607; columnNumber:51;字符引用“&#...”

但是,仅当我创建的配置单元表具有多个列时才会发生此错误。

例如,此代码有效:

CREATE EXTERNAL TABLE es_names_w
(
 firstname string
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'hive_test/names', 'es.index.auto.create' = 'true')

INSERT OVERWRITE TABLE es_names_w
    SELECT firstname
    FROM tmp_names_source;

一切顺利, Hive在elasticsearch索引中创建了一个新类型,并且数据已在Elasticsearch

中编入索引

我真的不知道为什么我的第一次尝试不起作用

我很感激一些帮助, 感谢

3 个答案:

答案 0 :(得分:0)

你能把它添加到tbl es.mapping.id'='key'。密钥可以是您的名字。

答案 1 :(得分:0)

尝试

es.index.auto.create' = 'false'

答案 2 :(得分:0)

尝试使用SerDe可以解决问题。例如。

 CREATE EXTERNAL TABLE elasticsearch_es (  
 name STRING, id INT, country STRING )  
 ROW FORMAT SERDE 'org.elasticsearch.hadoop.hive.EsSerDe'  
 STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'  
 TBLPROPERTIES ('es.resource'='elasticsearch/demo');

此外,请确保在ES中创建索引并键入时,您可以创建与ES中的Hive列完全相同的映射。