Azure HDInsight 中的 Apache Hive 和 HiveQL 是什么?

Apache Hive 是适用于 Apache Hadoop 的数据仓库系统。 使用 Hive 可以汇总、查询和分析数据。 Hive 查询使用 HiveQL 编写,它是类似于 SQL 的查询语言。

Hive 可以实现将结构投影到很大程度上未结构化的数据上。 定义结构后,可以使用 HiveQL 来查询这些数据,而无需具备 Java 或 MapReduce 方面的知识。

HDInsight 提供已针对特定工作负荷进行优化的多种群集类型。 以下群集类型最常用于 Hive 查询:

群集类型 说明
交互式查询 提供低延迟分析处理 (LLAP) 功能的 Hadoop 群集,可改善交互式查询的响应时间。 有关详细信息,请参阅 HDInsight 中的交互式查询入门文档。
Hadoop 针对批处理工作负荷进行优化的 Hadoop 群集。 有关详细信息,请参阅 HDInsight 中的 Apache Hadoop 入门文档。
Spark Apache Spark 提供内置的功能用于使用 Hive。 有关详细信息,请参阅 HDInsight 中的 Apache Spark 入门文档。
HBase HiveQL 可用于查询 Apache HBase 中存储的数据。 有关详细信息,请参阅 Apache HBase on HDInsight 入门文档。

如何使用 Hive

使用下表来了解将 Hive 与 HDInsight 配合使用的各种方法:

使用此方法,如果想要... ...交互式 查询 ...批处理 ...从此 客户端操作系统
Visual Studio Code 的 HDInsight 工具 Linux、Unix、Mac OS X 或 Windows
用于 Visual Studio 的 HDInsight 工具 Windows
Hive 视图 任何(基于浏览器)
Beeline 客户端 Linux、Unix、Mac OS X 或 Windows
REST API   Linux、Unix、Mac OS X 或 Windows
Windows PowerShell   Windows

HiveQL 语言参考

语言手册中提供了HiveQL 语言参考。

Hive 和数据结构

Hive 知道如何处理结构化和半结构化数据。 例如,字段由特定字符分隔的文本文件。 以下 HiveQL 语句基于空格分隔的数据创建一个表:

CREATE EXTERNAL TABLE log4jLogs (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION '/example/data/';

Hive 还支持对复杂或不规则的结构化数据使用自定义 序列化程序/反序列化程序 (SerDe)。 有关详细信息,请参阅如何将自定义 JSON SerDe 与 HDInsight 配合使用文档。

有关 Hive 支持的文件格式的详细信息,请参阅语言手册 (https://cwiki.apache.org/confluence/display/Hive/LanguageManual)

Hive 内部表与外部表

使用 Hive 可以创建两种类型的表:

  • 内部:数据存储在 Hive 数据仓库中。 数据仓库位于群集的默认存储中的 /hive/warehouse/ 上。

    当下列条件之一成立时,请使用内部表:

    • 数据是临时性的。
    • 希望 Hive 管理表和数据的生命周期。
  • 外部:数据存储在数据仓库外部。 数据可以存储在可由群集访问的任何存储中。

    当下列条件之一成立时,请使用外部表:

    • 数据也在 Hive 外部使用。 例如,另一个进程(不会锁定文件)会更新数据文件。
    • 数据需要保留在基础位置,即使在删除表之后。
    • 需要一个自定义位置,例如非默认存储帐户。
    • 由 Hive 以外的程序管理数据格式、位置等。

有关详细信息,请参阅 Hive 内部和外部表简介博客文章。

用户定义函数 (UDF)

还可以通过 用户定义函数 (UDF) 扩展 Hive。 UDF 允许实现 HiveQL 中不容易建模的功能或逻辑。 有关将 UDF 与 Hive 配合使用的示例,请参阅以下文档:

示例数据

Hive on HDInsight 中预先加载了名为 hivesampletable 的内部表。 HDInsight 还提供可与 Hive 配合使用的示例数据集。 这些数据集存储在 /example/data/HdiSamples 目录中。 这些目录存在于群集的默认存储中。

Hive 查询示例

以下 HiveQL 语句将各列投影到 /example/data/sample.log 文件上:

DROP TABLE log4jLogs;
CREATE EXTERNAL TABLE log4jLogs (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION '/example/data/';
SELECT t4 AS sev, COUNT(*) AS count FROM log4jLogs 
    WHERE t4 = '[ERROR]' AND INPUT__FILE__NAME LIKE '%.log' 
    GROUP BY t4;

在上例中,HiveQL 语句执行以下操作:

语句 说明
DROP TABLE 如果该表已存在,则删除它。
CREATE EXTERNAL TABLE 在 Hive 中创建一个新的“外部”表。 外部表只会在 Hive 中存储表定义。 数据以原始格式的形式保留在原始位置中。
ROW FORMAT 让 Hive 知道数据的格式已如何进行了设置。 在此情况下,每个日志中的字段以空格分隔。
STORED AS TEXTFILE LOCATION 让 Hive 知道数据的存储位置(example/data 目录),并且数据已存储为文本。 数据可以在一个文件中,也可以分散在目录的多个文件内。
SELECT 选择“t4”列中包含值“[ERROR]”的所有行的计数。 此语句返回的值为 3,因为有三行包含此值。
INPUT__FILE__NAME LIKE '%.log' Hive 会尝试对目录中的所有文件应用架构。 在此示例中,目录包含与架构不匹配的文件。 为防止结果中包含垃圾数据,此语句指示 Hive 应当仅返回以 .log 结尾的文件中的数据。

备注

如果希望通过外部源更新基础数据,应使用外部表。 例如,自动化数据上传过程或 MapReduce 操作。

删除外部表 不会 删除数据,只会删除表定义。

若要创建 内部 表而非外部表,请使用以下 HiveQL:

CREATE TABLE IF NOT EXISTS errorLogs (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
STORED AS ORC;
INSERT OVERWRITE TABLE errorLogs
SELECT t1, t2, t3, t4, t5, t6, t7 
    FROM log4jLogs WHERE t4 = '[ERROR]';

这些语句执行以下操作:

语句 说明
CREATE TABLE IF NOT EXISTS 如果该表不存在,则创建它。 由于未使用 EXTERNAL 关键字,因此此语句会创建内部表。 该表存储在 Hive 数据仓库中,并完全由 Hive 管理。
STORED AS ORC 以优化的行纵栏式 (ORC) 格式存储数据。 ORC 是高度优化且有效的 Hive 数据存储格式。
INSERT OVERWRITE ...SELECT 从包含“[ERROR]”的“log4jLogs”表中选择行,然后将数据插入“errorLogs”表中。

备注

与外部表不同,删除内部表会同时删除基础数据。

提高 Hive 查询性能

Apache Tez

Apache Tez 是可让数据密集型应用程序(例如 Hive)大规模高效运行的框架。 默认情况下,Tez 已启用。 Apache Hive on Tez 设计文档包含有关实现选项和优化配置的详细信息。

低延迟分析处理 (LLAP)

LLAP(有时称为 Live Long and Process)是 Hive 2.0 中的一项新功能,可对查询进行内存中缓存。 LLAP 能够大幅加快 Hive 查询的速度,在某些情况下,速度比 Hive 1.x 要快 2.6 倍

HDInsight 在交互式查询群集类型中提供 LLAP。 有关详细信息,请参阅交互式查询入门文档。

计划 Hive 查询

在计划的或按需工作流中,可以使用多个服务来运行 Hive 查询。

Azure 数据工厂

Azure 数据工厂允许将 HDInsight 用作数据工厂管道的一部分。 有关通过管道使用 Hive 的详细信息,请参阅在 Azure 数据工厂中使用 Hive 活动转换数据文档。

Hive 作业和 SQL Server Integration Services

可以使用 SQL Server Integration Services (SSIS) 来运行 Hive 作业。 Azure Feature Pack for SSIS 提供适用于 HDInsight 上的 Hive 作业的以下组件。

有关详细信息,请参阅 Azure 功能包文档。

Apache Oozie

Apache Oozie 是一个管理 Hadoop 作业的工作流和协调系统。 有关将 Oozie 与 Hive 配合使用的详细信息,请参阅使用 Apache Oozie 定义和运行工作流文档。

后续步骤

现在,已了解什么是 Hive,以及如何将它与 HDInsight 中的 Hadoop 配合使用,请使用以下链接来学习 Azure HDInsight 的其他用法。