GettingStarted

目录

安装和配置

您可以通过下载压缩包来安装 Hive 的稳定版本,也可以下载源代码并从中构建 Hive。

运行 HiveServer2 和 Beeline

Requirements

  • Java 1.7
    注意: Hive 版本1.2以后需要 Java 1.7 或更高版本。 Hive 0.14 至 1.1 版本也可与 Java 1.6 一起使用。强烈建议用户开始使用 Java 1.8(请参阅HIVE-8607)。

  • Hadoop 2.x(首选),1.x(Hive 2.0.0 及更高版本不支持)。
    最高为 0.13 的 Hive 版本还支持 Hadoop 0.20.x,0.23.x。

  • Hive 通常用于生产 Linux 和 Windows 环境。 Mac 是常用的开发环境。本文档中的说明适用于 Linux 和 Mac。在 Windows 上使用它需要略有不同的步骤。

从稳定版本安装 Hive

首先从一个 Apache 下载镜像(请参阅Hive Releases)下载 Hive 的最新稳定版本。

接下来,您需要打开压缩包的包装。这将导致创建一个名为hive-x.y.z(其中x.y.z是发行版号)的子目录:

$ tar -xzvf hive-x.y.z.tar.gz

将环境变量HIVE_HOME设置为指向安装目录:

$ cd hive-x.y.z
  $ export HIVE_HOME={{pwd}}

最后,将$HIVE_HOME/bin添加到您的PATH

$ export PATH=$HIVE_HOME/bin:$PATH

从源代码构建 Hive

最新 Hive 代码的 Hive GIT 存储库位于以下位置:git clone https://git-wip-us.apache.org/repos/asf/hive.git(主分支)。

所有发行版本均位于名为“ branch-0.#”或“ branch-1.#”或即将到来的“ branch-2.#”的分支中,但发行版“ 0.8.1”位于“ branch-0.8-r2”中”。具有其他名称的任何分支都是进行中作品的功能分支。有关详情,请参见了解配置单元分支

从 0.13 开始,Hive 使用Apache Maven构建。

在 master 上编译 Hive

要从 master 分支构建当前的 Hive 代码:

$ git clone https://git-wip-us.apache.org/repos/asf/hive.git
  $ cd hive
  $ mvn clean package -Pdist [-DskipTests -Dmaven.javadoc.skip=true]
  $ cd packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin
  $ ls
  LICENSE
  NOTICE
  README.txt
  RELEASE_NOTES.txt
 bin/ (all the shell scripts)
  lib/ (required jar files)
  conf/ (configuration files)
  examples/ (sample input and query files)
  hcatalog / (hcatalog installation)
  scripts / (upgrade scripts for hive-metastore)

在这里,\ {}是指当前的 Hive 版本。

如果使用 Maven(mvn)构建 Hive 源,则其余部分将目录“/packaging/target/apache-hive-{version} -SNAPSHOT-bin/apache-hive-{version} -SNAPSHOT-bin”称为\ 页面。

在分支 1 上编译 Hive

在分支 1 中,Hive 同时支持 Hadoop 1.x 和 2.x。您将需要通过 Maven 配置文件指定针对哪个版本的 Hadoop。要针对 Hadoop 1.x 构建,请使用配置文件hadoop-1;对于 Hadoop 2.x,请使用hadoop-2。例如,要针对 Hadoop 1.x 构建,上述 mvn 命令变为:

$ mvn clean package -Phadoop-1,dist

在 Hadoop 0.20 上编译 Hive 到 0.13 之前

在 Hive 0.13 之前,Hive 是使用Apache Ant构建的。要在 Hadoop 0.20 上构建旧版本的 Hive:

$ svn co http://svn.apache.org/repos/asf/hive/branches/branch-{version} hive
  $ cd hive
  $ ant clean package
  $ cd build/dist
  # ls
  LICENSE
  NOTICE
  README.txt
  RELEASE_NOTES.txt
  bin/ (all the shell scripts)
  lib/ (required jar files)
  conf/ (configuration files)
  examples/ (sample input and query files)
  hcatalog / (hcatalog installation)
  scripts / (upgrade scripts for hive-metastore)

如果使用 Ant,我们将目录“ build/dist”称为<install-dir>

在 Hadoop 0.23 上编译 Hive 到 0.13 之前

要针对 Hadoop 0.23、2.0.0 或其他版本在 Ant 中构建 Hive,请使用适当的标志进行构建;以下是一些示例:

$ ant clean package -Dhadoop.version=0.23.3 -Dhadoop-0.23.version=0.23.3 -Dhadoop.mr.rev=23
  $ ant clean package -Dhadoop.version=2.0.0-alpha -Dhadoop-0.23.version=2.0.0-alpha -Dhadoop.mr.rev=23

Running Hive

Hive 使用 Hadoop,因此:

  • 您必须在路径中包含 Hadoop 或

  • export HADOOP_HOME=<hadoop-install-dir>

此外,必须先使用下面的 HDFS 命令创建/tmp/user/hive/warehouse(又名hive.metastore.warehouse.dir)并将它们设置为chmod g+w,然后才能在 Hive 中创建表。

$ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
  $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

您可能会发现设置HIVE_HOME很有用,尽管没有必要:

$ export HIVE_HOME=<hive-install-dir>

运行 Hive CLI

要从 Shell 程序中使用 Hive 命令行界面(CLI):

$ $HIVE_HOME/bin/hive

运行 HiveServer2 和 Beeline

从 Hive 2.1 开始,我们需要运行以下 schematool 命令作为初始化步骤。例如,我们可以使用“ derby”作为数据库类型。

$ $HIVE_HOME/bin/schematool -dbType <db type> -initSchema

HiveServer2(在 Hive 0.11 中引入)具有自己的 CLI,称为Beeline。 HiveCLI 现在不赞成使用 Beeline,因为它缺少 HiveServer2 的多用户,安全性和其他功能。要从 shell 运行 HiveServer2 和 Beeline:

$ $HIVE_HOME/bin/hiveserver2

  $ $HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT

Beeline 是使用 HiveServer2 的 JDBC URL 启动的,该 URL 取决于启动 HiveServer2 的地址和端口。默认情况下,它将是(localhost:10000),因此地址看起来像 jdbc:hive2:// localhost:10000.

或者以相同的过程启动 Beeline 和 HiveServer2 以进行测试,以获得与 HiveCLI 类似的用户体验:

$ $HIVE_HOME/bin/beeline -u jdbc:hive2://

Running HCatalog

要在 Hive 版本 0.11.0 和更高版本中从 Shell 运行 HCatalog 服务器,请执行以下操作:

$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh

要在 Hive 版本 0.11.0 和更高版本中使用 HCatalog 命令行界面(CLI):

$ $HIVE_HOME/hcatalog/bin/hcat

有关更多信息,请参见HCatalog manual中的Tarball HCatalog 安装HCatalog CLI

运行 WebHCat(坦普尔顿)

要从 Hive 版本 0.11.0 和更高版本中的 Shell 运行 WebHCat 服务器,请执行以下操作:

$ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh

有关更多信息,请参阅WebHCat manual中的WebHCat Installation

配置 Management 概述

  • 默认情况下,Hive 从<install-dir>/conf/hive-default.xml获取其配置

  • 可以通过设置HIVE_CONF_DIR环境变量来更改 Hive 配置目录的位置。

  • 可以通过在<install-dir>/conf/hive-site.xml中(重新)定义配置变量来更改配置变量

  • Log4j 配置存储在<install-dir>/conf/hive-log4j.properties

  • Hive 配置是 Hadoop 之上的覆盖–默认情况下,它继承 Hadoop 配置变量。

  • 配置单元配置可以通过以下方式操作:

  • 编辑 hive-site.xml 并在其中定义任何所需的变量(包括 Hadoop 变量)

    • 使用 set 命令(请参阅下一节)

    • 使用以下语法调用 Hive(不建议使用),Beeline 或 HiveServer2:

  • $ bin/hive --hiveconf x1=y1 --hiveconf x2=y2 //this sets the variables x1 and x2 to y1 and y2 respectively

    • $ bin/hiveserver2 --hiveconf x1 = y1 --hiveconf x2 = y2 //这将服务器端变量 x1 和 x2 分别设置为 y1 和 y2

    • $ bin/beeline --hiveconf x1 = y1 --hiveconf x2 = y2 //这会将 Client 端变量 x1 和 x2 分别设置为 y1 和 y2.

    • HIVE_OPTS环境变量设置为“ --hiveconf x1=y1 --hiveconf x2=y2”,与上面的操作相同。

Runtime Configuration

  • 配置单元查询是使用 map-reduce 查询执行的,因此,此类查询的行为可以由 Hadoop 配置变量控制。

  • HiveCLI(不建议使用)和 Beeline 命令“ SET”可用于设置任何 Hadoop(或 Hive)配置变量。例如:

beeline> SET mapred.job.tracker=myhost.mycompany.com:50030;
    beeline> SET -v;

后者显示所有当前设置。如果没有-v选项,则仅显示与基本 Hadoop 配置不同的变量。

Hive,Map-Reduce 和 Local-Mode

Hive 编译器会为大多数查询生成 map-reduce 作业。然后将这些作业提交到变量指示的 Map-Reduce 集群中:

mapred.job.tracker

尽管这通常指向具有多个节点的 map-reduce 群集,但是 Hadoop 还提供了一个不错的选择,可以在用户工作站上本地运行 map-reduce 作业。这对于在小型数据集上运行查询非常有用–在这种情况下,本地模式执行通常比将作业提交到大型集群要快得多。可从 HDFS 透明访问数据。相反,本地模式仅使用一个减速器运行,并且处理大型数据集的速度可能非常慢。

从版本 0.7 开始,Hive 完全支持本地模式执行。要启用此功能,用户可以启用以下选项:

hive> SET mapreduce.framework.name=local;

此外,mapred.local.dir应该指向在本地计算机上有效的路径(例如/tmp/<username>/mapred/local)。 (否则,用户将获得分配本地磁盘空间的异常.)

从 0.7 版开始,Hive 还支持一种以本地模式自动运行 Map 减少作业的模式。相关选项是hive.exec.mode.local.autohive.exec.mode.local.auto.inputbytes.maxhive.exec.mode.local.auto.tasks.max

hive> SET hive.exec.mode.local.auto=false;

请注意,此功能默认为“禁用”。如果启用,则 Hive 会分析查询中每个 map-reduce 作业的大小,如果满足以下阈值,则可以在本地运行它:

  • 作业的总 Importing 大小小于:hive.exec.mode.local.auto.inputbytes.max(默认为 128MB)

  • Map 任务总数少于:hive.exec.mode.local.auto.tasks.max(默认为 4)

  • 所需的缩减任务总数为 1 或 0.

因此,对于小数据集的查询,或具有多个 map-reduce 作业的查询,这些作业对后续作业的 Importing 要小得多(由于先前作业中的缩减/过滤),因此可以在本地运行作业。

请注意,Hadoop 服务器节点的运行时环境和运行 HiveClient 端的计算机可能会有所不同(由于不同的 jvm 版本或不同的软件库)。在本地模式下运行时,这可能导致意外的行为/错误。还要注意,本地模式执行是在单独的子 HVM(HiveClient 端)中完成的。如果用户愿意,可以通过选项hive.mapred.local.mem来控制此子 jvm 的最大内存量。默认情况下,它设置为零,在这种情况下,Hive 让 Hadoop 确定子 jvm 的默认内存限制。

Hive Logging

Hive 使用 log4j 进行日志记录。默认情况下,CLI 不会将日志发送到控制台。对于 0.13.0 之前的 Hive 版本,默认日志记录级别为WARN。从 Hive 0.13.0 开始,默认日志记录级别为INFO

日志存储在目录/tmp/<user.name>中:

  • /tmp/<user.name>/hive.log
    注意:在local mode中,在 Hive 0.13.0 之前,日志文件名是“ .log”,而不是“ hive.log”。此错误已在版本 0.13.0 中修复(请参见HIVE-5528HIVE-5676)。

要配置其他日志位置,请在$ HIVE_HOME/conf/hive-log4j.properties 中设置hive.log.dir。确保目录设置了粘性位(chmod 1777 <dir>)。

  • hive.log.dir=<other_location>

如果用户愿意,可以通过添加以下所示的参数将日志发送到控制台:

  • bin/hive --hiveconf hive.root.logger=INFO,console //for HiveCLI (deprecated)

  • bin/hiveserver2 --hiveconf hive.root.logger=INFO,console

或者,用户只能通过以下方式更改日志记录级别:

  • bin/hive --hiveconf hive.root.logger=INFO,DRFA //for HiveCLI (deprecated) ``

  • bin/hiveserver2 --hiveconf hive.root.logger=INFO,DRFA ``

通过提供 DAILY 选项,日志记录的另一个选项是 TimeBasedRollingPolicy(适用于 Hive 1.1.0 及更高版本,HIVE-9001),如下所示:

  • bin/hive --hiveconf hive.root.logger=INFO,DAILY //for HiveCLI (deprecated)

  • bin/hiveserver2 --hiveconf hive.root.logger=INFO,DAILY

请注意,通过“ set”命令设置hive.root.logger不会更改日志记录属性,因为它们是在初始化时确定的。

Hive 还在每个 Hive 会话的基础上将查询日志存储在/tmp/<user.name>/中,但是可以在hive-site.xml中使用hive.querylog.location属性进行配置。从 Hive 1.1.0 开始,通过将hive.log.explain.output属性设置为 true,可以在 INFO 级别记录查询的EXPLAIN EXTENDED输出。

Hive 在 Hadoop 群集上执行期间的日志记录由 Hadoop 配置控制。通常,Hadoop 将为每个 Map 生成一个日志文件,并减少存储在执行任务的群集计算机上的任务。可以通过从 Hadoop JobTracker Web UI 单击“任务详细信息”页面来获取日志文件。

使用本地模式(使用mapreduce.framework.name=local)时,Hadoop/Hive 执行日志在 Client 端计算机本身上生成。从 0.6 版开始– Hive 使用hive-exec-log4j.properties(仅在缺少时回落到hive-log4j.properties)来确定默认情况下这些日志的传递位置。默认配置文件为在本地模式下执行的每个查询生成一个日志文件,并将其存储在/tmp/<user.name>下。提供单独的配置文件的目的是使 Management 员能够根据需要集中执行日志捕获(例如在 NFS 文件服务器上)。执行日志对于调试运行时错误非常宝贵。

有关 WebHCat 错误和日志记录的信息,请参阅WebHCat manual中的错误代码和响应Log Files

错误日志对于调试问题非常有用。请将所有错误(其中有很多!)发送给[email protected]

从 Hive 2.1.0 起(带有HIVE-13027),Hive 默认使用 Log4j2 的异步 Logger。将hive.async.log.enabled设置为 false 将禁用异步日志记录并回退到同步日志记录。异步日志记录可以显着提高性能,因为日志记录将在单独的线程中处理,该线程使用 LMAX 干扰者队列来缓冲日志消息。有关优缺点,请参见https://logging.apache.org/log4j/2.x/manual/async.html

HiveServer2 Logs

从 Hive 0.14 开始的 Client 端可以使用 HiveServer2 操作日志。有关配置,请参见HiveServer2 Logging

Audit Logs

对于每个 metastore API 调用,都会从 Hive Metastore 服务器记录审核日志。

审核日志具有记录在 metastore 日志文件中的功能和一些相关的功能参数。它以 log4j 的 INFO 级别记录,因此您需要确保已启用 INFO 级别的记录(请参阅HIVE-3505)。日志条目的名称为“ HiveMetaStore.audit”。

在 Hive 0.7 中为安全 Client 端连接(HIVE-1948)添加了审核日志,在 Hive 0.10 中为非安全连接(HIVE-3277;另请参见HIVE-2797)添加了审核日志。

Perf Logger

为了通过 PerfLogger 获得性能 Metrics,您需要为 PerfLogger 类(HIVE-12675)设置 DEBUG 级别的日志记录。这可以通过在 log4j 属性文件中设置以下内容来实现。

log4j.logger.org.apache.hadoop.hive.ql.log.PerfLogger=DEBUG

如果已经通过 hive.root.logger 从根将 Logger 级别设置为 DEBUG,则不需要上述设置即可查看性能日志。

DDL Operations

Hive DDL 操作记录在Hive 数据定义语言中。

创建配置单元表

hive> CREATE TABLE pokes (foo INT, bar STRING);

创建一个名为 pokes 的表,该表有两列,第一列是整数,另一列是字符串。

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

创建一个具有两列和一个名为 ds 的分区列的名为邀请的表。分区列是虚拟列。它不是数据本身的一部分,而是从特定数据集加载到的分区派生的。

默认情况下,假定表为文本 Importing 格式,并且定界符为^ A(ctrl-a)。

浏览表格

hive> SHOW TABLES;

列出所有表。

hive> SHOW TABLES '.*s';

列出所有以“ s”结尾的表。模式匹配遵循 Java 正则表达式。查看此链接以获取文档http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

hive> DESCRIBE invites;

显示列列表。

更改和删除表

表名称可以是changed,列可以是添加或替换

hive> ALTER TABLE events RENAME TO 3koobecaf;
  hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
  hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
  hive> ALTER TABLE invites REPLACE COLUMNS (foo INT, bar STRING, baz INT COMMENT 'baz replaces new_col2');

请注意,REPLACE COLUMNS 将替换所有现有的列,并且仅更改表的架构,而不更改数据。该表必须使用本机 SerDe。 REPLACE COLUMNS 也可以用于从表的架构中删除列:

hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');

Dropping tables:

hive> DROP TABLE pokes;

Metadata Store

元数据位于嵌入式 Derby 数据库中,其磁盘存储位置由名为_的 Hive 配置变量确定。默认情况下,此位置是./metastore_db(请参见conf/hive-default.xml)。

目前,在默认配置中,一次只能由一个用户看到此元数据。

Metastore 可以存储在 JPOX 支持的任何数据库中。 RDBMS 的位置和类型可以由两个变量javax.jdo.option.ConnectionURLjavax.jdo.option.ConnectionDriverName控制。有关受支持的数据库的更多详细信息,请参阅 JDO(或 JPOX)文档。数据库模式在src/contrib/hive/metastore/src/model的 JDO 元数据 Comments 文件package.jdo中定义。

将来,Metastore 本身可以成为独立服务器。

如果要将元存储作为 Web Service 器运行,以便可以从多个节点进行访问,请参见Hive 在服务器模式下使用 Derby

DML Operations

Hive DML 操作记录在Hive 数据处理语言中。

将平面文件中的数据加载到 Hive 中:

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

将包含由 ctrl-a 分隔的两列的文件加载到 pokes 表中。 “本地”表示 Importing 文件在本地文件系统上。如果省略“ LOCAL”,则它将在 HDFS 中查找文件。

关键字“ OVERWRITE”表示表中的现有数据已删除。如果省略“ OVERWRITE”关键字,则数据文件将附加到现有数据集。

NOTES:

  • load 命令不会根据模式对数据进行验证。

  • 如果文件在 hdfs 中,则将其移到 Hive 控制的文件系统名称空间中。
    Hive 目录的根由hive-default.xml中的hive.metastore.warehouse.dir选项指定。我们建议用户在尝试通过 Hive 创建表之前先创建此目录。

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
  hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');

上面的两个 LOAD 语句将数据加载到表邀请的两个不同分区中。必须通过键 ds 分区创建表邀请才能成功。

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

上面的命令会将数据从 HDFS 文件/目录加载到表中。
请注意,从 HDFS 加载数据将导致文件/目录的移动。结果,该操作几乎是瞬时的。

SQL Operations

Hive 查询操作记录在Select中。

Example Queries

一些示例查询如下所示。它们在build/dist/examples/queries中可用。
Hive 来源ql/src/test/queries/positive提供了更多信息。

选择和筛选

hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

invites表的分区ds=2008-08-15的所有行中选择列'foo'。结果不会存储在任何地方,而是显示在控制台上。

请注意,在以下所有示例中,INSERT(进入 Hive 表,本地目录或 HDFS 目录)都是可选的。

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

invites表的分区ds=2008-08-15中选择所有行到 HDFS 目录中。结果数据在该目录中的文件中(取决于 Map 器的数量)。
注意:分区列(如果有)通过使用*选择。也可以在投影子句中指定它们。

分区表必须始终在该语句的WHERE子句中选择一个分区。

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

从 pokes 表中选择所有行到本地目录。

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
  hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
  hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
  hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
  hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15';
  hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
  hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

选择一列的总和。也可以使用 avg,min 或 max。请注意,对于不包含HIVE-287的 Hive 版本,您需要使用COUNT(1)代替COUNT(*)

GROUP BY

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar;
  hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

请注意,对于不包含HIVE-287的 Hive 版本,您需要使用COUNT(1)代替COUNT(*)

JOIN

hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

MULTITABLE INSERT

FROM src
  INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
  INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
  INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
  INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

STREAMING

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

这将通过脚本/bin/cat在 Map 阶段流传输数据(类似于 Hadoop 流传输)。
同样-可以在 reduce 端使用流式传输(请参阅Hive Tutorial作为示例)。

简单示例用例

MovieLens 用户评分

首先,使用制表符分隔的文本文件格式创建一个表:

CREATE TABLE u_data (
  userid INT,
  movieid INT,
  rating INT,
  unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

然后,从GroupLens datasets页上的 MovieLens 100k (也有 README.txt 文件和未 zipfile 的索引)中下载数据文件:

wget http://files.grouplens.org/datasets/movielens/ml-100k.zip

or:

curl --remote-name http://files.grouplens.org/datasets/movielens/ml-100k.zip

注意:如果指向GroupLens datasets的链接不起作用,请在HIVE-5341上报告该链接,或向[email protected] 邮件列表发送消息。

解压缩数据文件:

unzip ml-100k.zip

并将u.data加载到刚刚创建的表中:

LOAD DATA LOCAL INPATH '<path>/u.data'
OVERWRITE INTO TABLE u_data;

计算表 u_data 中的行数:

SELECT COUNT(*) FROM u_data;

请注意,对于不包含HIVE-287的较旧版本的 Hive,您需要使用 COUNT(1)代替 COUNT(*)。

现在我们可以对表u_data进行一些复杂的数据分析:

创建weekday_mapper.py

import sys
import datetime

for line in sys.stdin:
  line = line.strip()
  userid, movieid, rating, unixtime = line.split('\t')
  weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
  print '\t'.join([userid, movieid, rating, str(weekday)])

使用 Map 器脚本:

CREATE TABLE u_data_new (
  userid INT,
  movieid INT,
  rating INT,
  weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

add FILE weekday_mapper.py;

INSERT OVERWRITE TABLE u_data_new
SELECT
  TRANSFORM (userid, movieid, rating, unixtime)
  USING 'python weekday_mapper.py'
  AS (userid, movieid, rating, weekday)
FROM u_data;

SELECT weekday, COUNT(*)
FROM u_data_new
GROUP BY weekday;

请注意,如果您使用的是 Hive 0.5.0 或更早版本,则需要使用COUNT(1)代替COUNT(*)

Apache Weblog 数据

Apache Weblog 的格式是可自定义的,而大多数网站 Management 员都使用默认格式。
对于默认的 Apache Weblog,我们可以使用以下命令创建表。

可以在HIVE-662HIVE-1719中找到有关 RegexSerDe 的更多信息。

CREATE TABLE apachelog (
  host STRING,
  identity STRING,
  user STRING,
  time STRING,
  request STRING,
  status STRING,
  size STRING,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;