前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive如何创建elasticsearch外部表

Hive如何创建elasticsearch外部表

原创
作者头像
空洞的盒子
发布2023-11-27 12:01:11
3930
发布2023-11-27 12:01:11
举报
文章被收录于专栏:JD的专栏

前言

Elasticsearch 是一个开源的分布式搜索和分析引擎,建立在 Apache Lucene 基础上。它提供了一个可扩展的、实时的搜索和分析平台,用于处理和分析大规模的结构化和非结构化数据。 在类实时读写与全文检索上有极大的优势。

Hive 是一个基于 Hadoop 的数据仓库工具,它提供了一种类似于 SQL 的查询语言(HiveQL)来进行数据分析和查询。Hive 的设计目标是为那些熟悉 SQL 的用户提供一种简单的方式来处理大规模的结构化和半结构化数据。

elasticsearch SQL

elasticsearch便于用户更加方便的进行数据查询,所以提供了SQL查询功能,其本质是将SQL语句解析为DSL语句进行执行并返回结果。elasticsearch SQL API仅支持group by,count,order by,having,limit等简单的函数,如果我们需要使用复杂SQL逻辑进行数据查询时,无法得到很好的支持。

外部表

Hive提供了一种外部表的功能,外部表只需要与数据存储位置上的现有数据建立关联,无需将数据移动至Hive存储库中进行存储,即可使用外部数据源。

创建外部表只需在创建表时使用 `EXTERNAL` 关键字指定表的类型。在以下样例中:我们在'LOCATION'参数指定了外部数据的存储位置。Hive 将使用该位置中的数据来填充外部表。

代码语言:sql
复制
CREATE EXTERNAL TABLE my_external_table (
  column1 INT,
  column2 STRING
)
LOCATION '/path/to/external/data';

elasticsearch外部表

借助于Hive强大且完善的类SQL能力,我们可以在Hive中通过创建elasticsearch外部表的方式来实现对elasticsearch集群数据的查询。极大程度降低了elasticsearch数据的查询门槛。

创建方式如下:

代码语言:javascript
复制
CREATE EXTERNAL TABLE IF NOT EXISTS ods.hive_elastic_table_test ( user_id string,
country string,
province string,
city string,
gender int
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES(
'es.index.auto.create'='false', 'es.index.read.missing.as.empty'='true', 'es.nodes.wan.only'='true', 'es.nodes.discovery' = 'false',
'es.nodes' = 'IP',
'es.port' = '9200',
'es.read.metadata'='true',
'es.resource' = 'es_index/_doc',
'es.mapping.names' = 'user_id:user_id, country:country, province:province, gender:gender', 'es.net.http.auth.pass'= '',
'es.net.http.auth.user'= 'elastic-reader' )
;

INSERT OVERWRITE TABLE hive_elastic_table_test
SELECT a.user_id, a.country, a.province, a.city, a.gender FROM (
SELECT user_id
,country
,province
,city
,gender
FROM hs_user
) a;

在创建过程中,可能会出现以下报错:

代码语言:java
复制
Error: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpConnection Manager
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:157) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1844) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:169)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpConnectionManager
at org.elasticsearch.hadoop.rest.commonshttp.CommonsHttpTransportFactory.create(CommonsHttpTransportFac
tory.java:40)
at org.elasticsearch.hadoop.rest.NetworkClient.selectNextNode(NetworkClient.java:99)
at org.elasticsearch.hadoop.rest.NetworkClient.<init>(NetworkClient.java:82)
at org.elasticsearch.hadoop.rest.NetworkClient.<init>(NetworkClient.java:58)
at org.elasticsearch.hadoop.rest.RestClient.<init>(RestClient.java:101)
at org.elasticsearch.hadoop.rest.RestService.createWriter(RestService.java:620)
at org.elasticsearch.hadoop.mr.EsOutputFormat$EsRecordWriter.init(EsOutputFormat.java:175)
at org.elasticsearch.hadoop.hive.EsHiveOutputFormat$EsHiveRecordWriter.write(EsHiveOutputFormat.java:59) at org.apache.hadoop.hive.ql.exec.FileSinkOperator.process(FileSinkOperator.java:762)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897)
at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:130)
at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:148)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:547)
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:148)
... 8 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.httpclient.HttpConnectionManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 24 more
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

解决方法

代码语言:javascript
复制
cp hadoop/share/hadoop/tools/lib/commons-httpclient-3.1.jar hive/auxlib/ 

elasticsearch外部表的优势

1. 统一查询接口:Hive 提供了统一的SQL查询接口,使得可以使用标准的SQL语句来查询Elasticsearch的数据。不需要学习elasticsearch的查询语法,可以直接使用熟悉的 SQL 进行数据分析和查询。

2. 弹性扩展:通过Hive创建elasticsearch外部表,可以将elasticsearch 的数据与其他数据源进行联合查询。这样可以方便地在Hive中进行跨数据源的分析和聚合操作,实现更复杂的数据处理需求。

3. 数据格式转换:Hive支持对数据进行格式转换,可以将 Elasticsearch 中的数据转换为其他格式,如Parquet、ORC 等。这样可以提高数据的存储效率和查询性能。

4. 数据仓库集成:Hive 是一种常用的数据仓库工具,可以与其他数据仓库组件(如 Hadoop、Spark 等)进行集成。通过将 elasticsearch数据与其他数据源整合到 Hive 中,可以更好地管理和组织数据,并进行更复杂的数据处理和分析。

5. 安全性和权限控制:Hive 提供了灵活的安全性和权限控制机制,可以对elasticsearch外部表进行访问控制,保护数据的安全性。

注意事项:Hive中的某些高级特性(如事务、复杂数据类型等)可能无法与elasticsearch完全兼容。数据的一致性和实时性也需要根据具体的数据同步策略进行管理。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • elasticsearch SQL
  • 外部表
  • elasticsearch外部表
    • 解决方法
    • elasticsearch外部表的优势
    相关产品与服务
    Elasticsearch Service
    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档