Hadoop教程

示例

让我们看一下如何用Hive査询我们在前面几章使用的气象数据集。第一个步骤是 把数据加载到出^管理的存储。在这里,我们将让出^把数据存储在本地文件系 统。稍后我们会介绍如何把表存储到HDFS。

和RDBMS —样,Hive把数据组织成表。我们使用CREATETABLE语句为气象数据 新建一个表:

CREATE TABLE records (year STRING, temperature INT, quality INT)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t';

查询的第一行声明了一个records表,它包含三列:year, temperature和 quality.我们还必须指明每一列的数据类型:在这里,年份为字符串类型,而另 两列为整数型。

到目前为止,SQL都是我们所熟悉的。但是接下来的ROWFORMAT子句是HiveQL 所特有的。这个子句所声明的是数据文件的每一行是由制表符分隔的文本。Hive 按照:每行三个字段,分别对应于表中的三列,字段间以制表符分隔;每行以换行 符分隔,这一格式读取数据。

接下来,我们可以向Hive输入数据。这里我们出于探索的目的,只使用一个很小 的样本数据集:

LOAD DATA LOCAL INPATH 'input/ncdc/micro-tab/sample.txt'OVERWRITE INTO TABLE records;

运行这一命令会告诉Hive把指定的本地文件放到它的仓库目录中。这只是一个简 单的文件系统操作。这个操作并不解析文件或把它存储为内部数据库格式。这是因 为Hive并不强行使用某种特定的文件格式。文件以原样逐字存储:Hive并不对文 件进行修改。

这样,records表的文件便可以在本地文件系统的/usf/hive/waKehouse/fecofds目录 中找到:

% 1s /user/hive/warehouse/record/sample.txt

我们现在只有一个文件:sample.txt,但是在一般情况下,它允许有多个文件,而 且Hive会在查询表的时候读入所有这些文件。

LOADDATA语句中的OVERWRITE关键字告诉Hive删除表所对应目录中已有的所有 文件。如果省去这一关键字,Hive就简单地把新的文件加入目录(除非目录下正好 有同名的文件,否则将替换掉原有的同名文件)。

现在数据已经在Hive中,我们可以对它运行一个查询:

hive> SELECT year, MAX(temperature)>FROM records>WHERE temperature != 9999>AND (quality = 0 OR quality = 1 OR quality = 4 OR quality = 5 OR quality = 9)>GROUP BY year;1949  1111950  22

这个SQL查询没什么特别的:它是一个带GROUPBY子句的SELECT语句。这个查 询根据年份对行进行分组,然后使用MAX()聚集函数在每个年份组中找到最高气 温。Hive的优势在于把这个查询转化为一个MapReduce作业,并为我们执行这个 作业,然后把结果打印输出到控制台。虽然Hive和其他数据库有一些细微的差 别,例如Hive支持的SQL的结构以及查询中可以使用的数据的格式等——我们在 本章中将介绍一些这种差别一但正是因为能够在原始数据上执行SQL查询,才 彰显了Hive的强大功能。

关注微信获取最新动态