大数据技术之Hive入门

大数据技术之Hive入门

  • 安装和配置
    • 前提要求
    • 安装稳定版本的Hive
    • 使用源代码构建Hive
      • 在master分支上编译Hive
      • 在branch-1分支上编译Hive
      • 在Hadoop 0.20上编译Hive到0.13之前
      • 在Hadoop 0.23上编译Hive到0.13之前
    • 运行Hive
      • 运行Hive CLI
      • 运行HiveServer2和Beeline
      • 运行HCatalog
      • 运行WebHCat(Templeton)
    • 配置管理概述
    • 运行时配置
    • Hive, Map-Reduce和本地模式
    • Hive日志
      • HiveServer2 Logs
      • Audit Logs
      • Perf Logger
  • DDL操作
    • 创建Hive表
    • 浏览表
    • 修改或者删除表
    • 元数据的存储
  • DML操作
  • SQL操作
    • 查询示例
      • 查询和过滤
      • GROUP BY
      • JOIN
      • 多表插入
      • 流式处理
    • 简单用户示例
      • MovieLens用户评分
      • Apache Weblog数据

安装和配置

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

运行HiveServer2和Beeline

前提要求

  • 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的最新稳定版本(请参阅Hive版本)。

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

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

将环境变量HIVE_HOME设置为Hive的安装目录:

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

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

  $ export PATH=$HIVE_HOME/bin:$PATH

使用源代码构建Hive

最新的Hive代码放在Hive的Git仓库中的这个地址上面:使用如下命令从Hive的Git仓库中克隆

git clone https://git-wip-us.apache.org/repos/asf/hive.git (the master branch)

所有发行版本均位于名为“ branch-0.#”或“ branch-1.#”或即将推出的“ branch-2.#”的分支中,除了发行版0.8.1是在“branch-0.8-r2”这个分支中。具有其他名称的任何分支都是进行中工作的功能分支。有关详细信息,请参见了解Hive分支。

从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
  $ 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)

这里,上面的{version}指的是当前的Hive版本。

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


在branch-1分支上编译Hive

在branch-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”称为。


在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

运行Hive

运行Hive需要使用到Hadoop,因此:

  • 您必须在环境变量中配置了Hadoop
  • 在Path中配置了export HADOOP_HOME=

此外,必须先使用以下HDFS命令创建/tmp/user/hive/warehouse(aka 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://

运行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手册中的用压缩包安装HCatalog和HCatalog CLI。


运行WebHCat(Templeton)

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

  $ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh

有关更多信息,请参见WebHCat手册中的WebHCat安装。


配置管理概述

  • Hive默认情况下从/conf/hive-default.xml获取其配置
  • 可以通过设置HIVE_CONF_DIR环境变量来更改Hive配置目录的位置。
  • 可以通过(重新)在/conf/hive-site.xml中定义配置变量来进行更改
  • Log4j配置存储在/conf/hive-log4j.properties中
  • Hive配置是Hadoop之上进行覆盖–默认情况下,它继承Hadoop配置变量。
  • Hive的配置可以通过以下方式操作:
    • 编辑hive-site.xml并在其中定义任何所需的变量(包括Hadoop变量)
    • 使用set命令(请参阅下一节)
    • 使用语法调用Hive(不建议使用),Beeline或HiveServer2
      • $ bin / hive --hiveconf x1 = y1 --hiveconf x2 = y2 //这将变量x1和x2分别设置为y1和y2
      • $ bin / hiveserver2 --hiveconf x1 = y1 --hiveconf x2 = y2 //这将服务器端变量x1和x2分别设置为y1和y2
      • $ bin / beeline --hiveconf x1 = y1 --hiveconf x2 = y2 //这会将客户端变量x1和x2分别设置为y1和y2。
    • 将HIVE_OPTS环境变量设置为“–hiveconf x1=y1 --hiveconf x2=y2”,其操作与上述相同。

运行时配置

  • Hive查询是使用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和本地模式

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

  mapred.job.tracker

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

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

  hive> SET mapreduce.framework.name=local;

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

从0.7版开始,Hive还支持一种以本地模式自动运行map-reduce作业的模式。相关选项为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作业的大小,如果满足以下阈值,则可以在本地运行它:

  • 作业的总输入大小要小于:hive.exec.mode.local.auto.inputbytes.max(默认为128MB)
  • map任务的总数小于:hive.exec.mode.local.auto.tasks.max(默认为4)
  • 所需的reduce任务总数为1或0。

因此,对于小数据集的查询,或者对于具有多个map-reduce作业的查询,这些作业对后续作业的输入要小得多(由于先前作业中的reduction和filtering),因此可以在本地运行作业。

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


Hive日志

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

  • 日志存储在目录/tmp/中:
    • /tmp//hive.log

    • 注意:在本地模式下,在Hive 0.13.0之前,日志文件名是“ .log”而不是“ hive.log”。此Bug已在版本0.13.0中修复(请参见HIVE-5528和HIVE-5676)。

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

    • hive.log.dir=

  • 如果用户愿意,可以通过添加以下所示的参数将日志发送到控制台:
    • 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//中,但是可以使用hive.querylog.location属性在hive-site.xml中进行配置。从Hive 1.1.0开始,通过将hive.log.explain.output属性设置为true,可以在INFO级别记录查询的EXPLAIN EXTENDED输出。

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

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

有关WebHCat错误和日志记录的信息,请参见WebHCat手册中的错误代码和响应以及日志文件。

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

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


HiveServer2 Logs

HiveServer2操作日志可用于从Hive 0.14开始的客户端。有关配置,请参阅HiveServer2 Logging的配置。


Audit Logs

对于每个metastore API调用,都会从Hive Metastore服务器记录Audit Logs。

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

在Hive 0.7中添加了Audit logs以实现安全客户端连接(HIVE-1948),在Hive 0.10中添加了非安全连接(HIVE-3277;也可以参见HIVE-2797)。


Perf Logger

为了通过PerfLogger获得性能指标,您需要为PerfLogger类(log4j.logger.org.apache.hadoop.hive.ql.log.PerfLogger=DEBUG

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


DDL操作

Hive DDL操作在Hive数据定义语言里面有记录,可以参阅。

创建Hive表

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

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


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

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

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


浏览表

 hive> SHOW TABLES;

列出所有表。


hive> SHOW TABLES '.*s';

列出所有以“s”结尾的表。模式匹配遵循Java正则表达式。查阅此链接以获取文档。


hive> DESCRIBE invites;

显示表中的所有的列。


修改或者删除表

表名称可以更改,列可以添加或替换:

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

删除表:

 hive> DROP TABLE pokes;

元数据的存储

元数据位于嵌入式Derby数据库中,存储在磁盘的位置可以使用Hive配置变量:javax.jdo.option.ConnectionURL来确定。默认情况下,是存储在./metastore_db(请参阅conf/hive-default.xml)这个目录下面。

现在,在默认配置中,此元数据一次只能对一个用户可见。

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

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

如果要将元存储作为网络服务器运行,以便可以从多个节点对其进行访问,请参阅在服务器模式下使用Derby进行Hive配置。


DML操作

Hive DML操作是Hive数据操作语言。

将本地文件中的数据加载到Hive中:

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

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

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

请注意:

  • 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语句将数据加载到invites表的两个不同分区中。必须通过键ds分区创建invites表才能成功。


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

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


SQL操作

Hive查询操作被记录在Select中。


查询示例

一些查询示例如下所示。它们在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 (into a Hive table, local directory or HDFS directory)都是可选的。


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

从invites表查询分区为ds = 2008-08-15的所有的行到HDFS目录中。结果数据位于该目录中的文件中(取决于mappers的数量)。
通过使用*选择分区列(如果有的话)。也可以在projection子句中指定它们。

分区表必须始终在该语句的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-287Hive版本,您需要使用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;

多表插入

  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;

流式处理

 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教程以获取示例)。


简单用户示例

MovieLens用户评分

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

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

然后,从GroupLens数据集页面上的MovieLens 100k下载数据文件(该页面还具有README.txt文件和未压缩文件的索引):

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

或者:

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

注意:如果无法访问GroupLens数据集的链接,请在HIVE-5341上进行报告或将消息发送至[email protected]邮件列表。


解压数据文件:

unzip ml-100k.zip

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

LOAD DATA LOCAL INPATH '/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)])

使用mapper脚本:

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的格式是可自定义的,而大多数网站管理员都使用默认格式。
对于默认的Apache Weblog,我们可以使用以下命令创建表。
有关RegexSerDe的更多信息,请参见HIVE-662和HIVE-1719。

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;

你可能感兴趣的:(大数据技术之Hive)