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-site.xml
文件指定的hive.aux.jars.path
属性来注册其他 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 时,可以在声明由 Elasticsearch 支持的外部表时,使用TBLPROPERTIES
指定配置属性(作为 Hadoop Configuration
对象的替代方法)
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
返回。