# 九、使用 Hive 存储输出

根据官方[阿帕奇 Hive 项目页面](http://hive.apache.org/):

[![http://hive.apache.oimg/hive_logo_medium.jpg](img/image009.jpg)](http://hive.apache.org/)

```cs
      Hive is a data warehouse system for Hadoop that facilitates easy data summarization, ad hoc queries, and the analysis of large data sets stored in Hadoop compatible file systems. Hive provides a mechanism to project structure onto this data and query the data using a SQL-like language called HiveQL. At the same time, this language also allows traditional Map/Reduce programmers to plug in their custom Mappers and Reducers when it is inconvenient or inefficient to express this logic in HiveQL.

```

Hive 是一种语言，允许您将类似 SQL 的结构放在以原始文件(如分隔文本)存储的数据之上，然后使用 HiveQL 查询该数据。它的架构允许使用 MapReduce 范式对查询作业进行大规模并行化，因为 Hive 命令被转换为 MapReduce 作业以便执行。和 Pig 一样，这不会直接暴露给 Hive 程序员。

与 Pig 在功能上有一些重叠，在某些情况下，Hive 或 Pig 可以执行相同的功能。您使用哪种工具是根据要执行的任务、开发人员对给定语言的舒适程度以及从性能角度来看哪种方法更有效来决定的。对于那些更熟悉传统 SQL 的人来说，Hive 通常是比 Pig 更好的入口点。

## 创建一个外部表来参考清管器输出

Pig 已经将处理的输出存储到 HDFS 的一个文件中，现在我们可以使用 Hive 在它上面放置一个语义层。这是通过在 Hive 中创建一个名为“外部表”的实体来完成的，该实体描述了一个文件的类似表的结构。

下面是引用字数统计过程输出的代码示例:

```cs
      CREATE EXTERNAL TABLE words (
      word STRING,
      counts INT,
      sentiment INT
      )
      ROW FORMAT DELIMITED
      FIELDS TERMINATED BY '124'
      STORED AS TEXTFILE
      LOCATION '/user/hadoop/pig_out/words';

```

这种类似于 SQL 的结构创建了一个“外部表”(即，对配置单元环境之外的文件的引用)。然后，它使用可用作数据类型的原语来定义列。然后，它指定行格式、字段分隔符(作为 ASCII 数字)、存储类型(在本例中是文本文件)，当然还有位置。

该文本文件现在可以在 Hive 表中引用，就像它是 Hive 环境中的普通表一样。下面是一个示例查询和结果:

```cs
      SELECT * FROM words
      ORDER BY counts DESC
      LIMIT 10

```

该查询从字数输出中按频率计数选择前 10 个单词。

一旦数据出现在 Hive 表中，就可以通过 ODBC 进行访问，并导入到选择的工具中。

值得注意的是，Hive 并不是公开数据的唯一方式。Pig 甚至基本 Hadoop 作业的输出只是文本文件，可以由任何能够解释定义输出的结构的工具来处理。但是，Hive 的优势在于能够通过使用 WHERE 子句交互过滤内容，或者使用 HiveQL 添加字段或计算。