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。通常,最好使用分布式文件系统(如 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
。