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 设置

映射编辑

默认情况下,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 列 date 映射到 Elasticsearch 中的 @timestamp;Hive 列 url 映射到 Elasticsearch 中的 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;

Elasticsearch Hive StorageHandler

与给定存储关联的 Elasticsearch 资源(索引和类型)

对于需要指定文档的 ID(或其他元数据字段,如 ttltimestamp)的情况,可以通过设置适当的映射(即 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 文档。也就是说,库将识别特定的文本类型(如 stringbinary),或者简单地调用(toString)。

表 3. 用于 JSON 表示的 Hive 类型

Hive 类型 注释

binary

当 JSON 数据表示为 byte[] 或类似类型时使用此选项

string

如果 JSON 数据表示为 String,则使用此选项

其他任何类型

确保 toString() 返回所需的 JSON 文档

varchar

将其用作 Hive string 的替代方法

确保数据使用 UTF-8 正确编码。字段内容被视为发送到 Elasticsearch 的文档的最终形式。

CREATE EXTERNAL TABLE json (data STRING) 
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = '...',
              'es.input.json` = 'yes'); 
...

表声明只有一个 STRING 类型的字段

指示 elasticsearch-hadoop 表内容为 JSON 格式

写入动态/多资源编辑

可以通过使用模式将数据索引到不同的资源,具体取决于正在读取的。回到前面提到的媒体示例,可以将其配置如下

CREATE EXTERNAL TABLE media (
    name    STRING,
    type    STRING,
    year    STRING,
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'my-collection-{type}/doc'); 

资源模式使用的表字段。可以使用任何已声明的字段。

使用字段 type 的资源模式

对于要写入的每一,elasticsearch-hadoop 将提取 type 字段并使用其值来确定目标资源。

在处理原始 JSON 时,此功能也可用 - 在这种情况下,将从 JSON 文档本身中提取值。假设 JSON 源包含具有以下结构的文档

{
    "media_type":"music",
    "title":"Surfing With The Alien",
    "year":"1987"
}

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');

表的架构声明。由于使用了 JSON 输入,该架构只是一个原始数据的持有者

依赖于 JSON 文档的字段而不是表架构的资源模式

从 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;

相同的 Elasticsearch Hive StorageHandler

Elasticsearch 资源

Elasticsearch 查询

类型转换编辑

如果使用自动索引创建,请查看节以了解更多信息。

Hive 提供了各种类型来定义数据,并在内部使用不同的实现,具体取决于目标环境(从 JDK 本地类型到二进制优化类型)。Elasticsearch 与所有这些类型集成,包括 Serde2 lazylazy binary

Hive 类型 Elasticsearch 类型

void

null

boolean

boolean

tinyint

byte

smallint

short

int

int

bigint

long

double

double

float

float

string

string

binary

binary

timestamp

date

struct

map

map

map

array

array

union

尚不支持

decimal

string

date

date

varchar

string

char

string

虽然 Elasticsearch 理解 Hive 2.0 版本之前的类型,但它向后兼容 Hive 1.0

值得一提的是,仅在 Elasticsearch 中可用的丰富数据类型(如 GeoPointGeoShape)通过将其结构转换为上表中可用的基元来支持。例如,根据其存储,geo_point 可能会返回为 stringarray