Apache Hive 集成
编辑Apache Hive 集成
编辑
Hive 是一个 Hadoop 的数据仓库系统,它方便了对存储在 Hadoop 兼容文件系统中的大型数据集进行数据汇总、即席查询和分析。 |
||
-- Hive 网站 |
Hive 通过一种类似 SQL 的语言(称为 HiveQL)来抽象 Hadoop,以便用户可以像使用 SQL 一样对其应用数据定义和操作。在 Hive 中,数据集通过表(暴露类型信息)定义,数据可以在表中加载,并通过内置运算符或自定义/用户定义函数(或UDF)进行选择和转换。
安装
编辑将 elasticsearch-hadoop jar 文件放入 Hive 的类路径中。根据你的选择,有多种方法可以实现这一点。使用ADD命令将文件、jar 文件(这是我们想要的)或存档添加到类路径中。
ADD JAR /path/elasticsearch-hadoop.jar;
该命令需要一个正确的 URI,该 URI 可以在本地文件系统或远程找到。通常,最好使用分布式文件系统(如 HDFS 或 Amazon S3)并使用它,因为脚本可能在不同的机器上执行。
当使用 JDBC/ODBC 驱动程序时,ADD JAR
命令不可用,将被忽略。因此,建议将 jar 文件添加到 Hive 的全局类路径中,如下所示。
作为替代方案,可以使用命令行:
CLI 配置。
$ bin/hive --auxpath=/path/elasticsearch-hadoop.jar
或使用 hive.aux.jars.path
属性(可以通过命令行指定,或者如果可用,可以通过 hive-site.xml
文件指定)来注册额外的 jar 文件(也接受 URI):
$ bin/hive -hiveconf hive.aux.jars.path=/path/elasticsearch-hadoop.jar
或者,如果可以修改 hive-site.xml
配置,则可以通过 hive.aux.jars.path
选项(也接受 URI)来注册额外的 jar 文件:
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>
配置
编辑当使用 Hive 时,可以使用 TBLPROPERTIES
来指定配置属性(作为 Hadoop Configuration
对象的替代方案),当声明由 Elasticsearch 支持的外部表时。
CREATE EXTERNAL TABLE artists (...) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = 'radio/artists', 'es.index.auto.create' = 'false');
映射
编辑默认情况下,elasticsearch-hadoop 使用 Hive 表模式来映射 Elasticsearch 中的数据,在此过程中同时使用字段名称和类型。然而,在某些情况下,Hive 中的名称不能用于 Elasticsearch(字段名称可以包含 Elasticsearch 接受但 Hive 不接受的字符)。对于这种情况,可以使用 es.mapping.names
设置,该设置接受以逗号分隔的映射名称列表,格式如下:Hive 字段名称
:Elasticsearch 字段名称
例如:
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 是大小写不敏感的,而 Elasticsearch 不是。信息的丢失可能会创建无效的查询(因为 Hive 中的列可能与 Elasticsearch 中的列不匹配)。为了避免这种情况,elasticsearch-hadoop 始终会将 Hive 列名称转换为小写。尽管如此,建议使用默认的 Hive 样式,仅对 Hive 命令使用大写名称,并避免使用混合大小写的名称。
Hive 通过一个特殊的值 NULL
来处理缺失值,如此处所示。这意味着当运行错误的查询(使用不正确或不存在的字段名称)时,Hive 表将填充 NULL
,而不是抛出异常。请确保验证你的数据并密切关注你的模式,因为由于这种宽松的行为,更新否则将不会被注意到。
将数据写入 Elasticsearch
编辑有了 elasticsearch-hadoop,Elasticsearch 就变成了一个外部的表,可以从中加载或读取数据
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;
对于需要指定文档 ID(或其他元数据字段,如 ttl
或 timestamp
)的情况,可以通过设置适当的映射来实现,即 es.mapping.id
。按照前面的示例,要指示 Elasticsearch 使用字段 id
作为文档 ID,请更新 table
属性
CREATE EXTERNAL TABLE artists ( id BIGINT, ...) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.mapping.id' = 'id'...);
将现有 JSON 写入 Elasticsearch
编辑对于作业输入数据已经是 JSON 格式的情况,elasticsearch-hadoop 允许直接索引而无需应用任何转换;数据按原样获取并直接发送到 Elasticsearch。在这种情况下,需要通过设置 es.input.json
参数来指示 JSON 输入。因此,在这种情况下,elasticsearch-hadoop 期望输出表只包含一个字段,该字段的内容用作 JSON 文档。也就是说,该库将识别特定的文本类型(如 string
或 binary
)或简单地调用 (toString
)。
表 3. 用于 JSON 表示的 Hive 类型
Hive 类型 |
注释 |
---|---|
|
当 JSON 数据表示为 |
|
如果 JSON 数据表示为 |
其他任何类型 |
确保 |
|
使用此项作为 Hive |
请确保数据以 UTF-8
正确编码。字段内容被认为是发送到 Elasticsearch 的文档的最终形式。
CREATE EXTERNAL TABLE json (data STRING) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = '...', 'es.input.json` = 'yes'); ...
写入动态/多资源
编辑可以通过使用模式,将数据索引到不同的资源,具体取决于正在读取的行。回到前面提到的媒体示例,可以如下配置:
CREATE EXTERNAL TABLE media ( name STRING, type STRING, year STRING, STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource' = 'my-collection-{type}/doc');
对于即将写入的每个行,elasticsearch-hadoop 将提取 type
字段,并使用其值来确定目标资源。
该功能在处理原始 JSON 时也可用 - 在这种情况下,该值将从 JSON 文档本身中提取。假设 JSON 源包含具有以下结构的文档
该表的声明可以如下:
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');
从 Elasticsearch 读取数据
编辑从 Elasticsearch 读取数据非常相似
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 提供了各种类型来定义数据,并根据目标环境(从 JDK 本机类型到二进制优化类型)在内部使用不同的实现。Elasticsearch 与所有这些类型集成,包括 Serde2 lazy 和 lazy binary
Hive 类型 | Elasticsearch 类型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
尚不支持 |
|
|
|
|
|
|
|
|
虽然 Elasticsearch 了解 Hive 2.0 版本之前的类型,但它向后兼容 Hive 1.0
值得一提的是,Elasticsearch 中仅可用的丰富数据类型,如GeoPoint
或GeoShape
,可以通过将其结构转换为上表中的可用原语来支持。例如,根据其存储,geo_point
可能以 string
或 array
的形式返回。