Hive 快速上手--官网中文翻译

目录

 

安装和配置

从一个稳定的发行版安装Hive

编译Hive源码

编译主干的Hive

编译分支branch-1

在Hadoop 0.20上在0.13之前编译Hive

在Hadoop 0.23上在0.13之前编译Hive(Ant)

运行Hive

运行 Hive CLI

运行HiveServer2 和 Beeline

运行HCatalog

运行WebHCat (Templeton)

配置管理概述

动态修改配置

Hive, Map-Reduce和Local-Mode

Hive日志

HiveServer2日志

审查日志

性能日志记录器

DDL 操作

创建Hive表

查询表

更改和删除表

Metadata Store

数据操纵

Sql操作

实例查询

SELECTS and FILTERS

GROUP BY

JOIN

MULTITABLE INSERT

STREAMING

简单的用例

MovieLens User Ratings

Apache Weblog Data


安装和配置

您可以通过下载tarball来安装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以后不支持)。Hive版本高达0.13也支持Hadoop 0.20。x, 0.23.x。
  • Hive通常用于生产Linux和Windows环境。Mac是一种常用的开发环境。本文档中的说明适用于Linux和Mac。在Windows上使用它需要稍微不同的步骤。 

从一个稳定的发行版安装Hive

首先从Apache下载镜像之一下载Hive的最新稳定版本(参见Hive版本)。接下来,您需要解压tarball。这将创建一个名为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添加到您的路径:

$ export PATH=$HIVE_HOME/bin:$PATH

编译Hive源码

最新Hive代码的Hive GIT存储库位于这里:GIT克隆https://git-wip-us.apache.org/repos/asf/hive.git(主分支)。

所有发布版本都在名为“branch-0”的分支中。#”或“为1。#“或即将到来的”分支-2。,除了在“branch-0.8-r2”中发布的0.8.1版本。任何具有其他名称的分支都是正在进行的工作的特性分支。有关详细信息,请参见理解Hive分支。

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

编译主干的Hive

要从主分支编译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/(所有shell脚本)
  lib/(需要的jar文件)
  conf /(配置文件)
  examples/(示例输入和查询文件)
  hcatalog / (hcatalog安装)
  scripts/ (hive-metastore的升级脚本)

这里,{version}引用当前Hive版本。

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

编译分支branch-1

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

$ mvn clean package -Phadoop-1,dist

在Hadoop 0.20上在0.13之前编译Hive

在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/(所有shell脚本)
  lib/(需要的jar文件)
  conf /(配置文件)
  examples/(示例输入和查询文件)
  hcatalog / (hcatalog安装)
  scripts/ (hive-metastore的升级脚本)

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

在Hadoop 0.23上在0.13之前编译Hive(Ant)

要在Ant中针对Hadoop 0.23、2.0.0或其他版本构建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或
  • 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”作为db类型。

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

HiveServer2(在Hive 0.11中引入)有自己的CLI,称为Beeline。由于缺少HiveServer2的多用户、安全性和其他功能,HiveCLI现在不支持使用Beeline 。在命令行运行HiveServer2和Beeline :

 $ $HIVE_HOME/bin/hiveserver2

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

Beeline 是由HiveServer2的JDBC 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手册中的Tarball和HCatalog CLI中的HCatalog安装。

运行WebHCat (Templeton)

要在Hive版本0.11.0或更高版本中从shell运行WebHCat服务器:

 $ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh

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

配置管理概述

  • Hive默认情况下从<install-dir>/conf/ Hive -default.xml获取配置
  • 可以通过设置HIVE_CONF_DIR环境变量来更改Hive配置目录的位置。
  • 配置变量可以在<install-dir>/conf/hive-site.xml中重新定义
  • Log4j配置存储在<install-dir>/conf/ hivelog4j .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和Local-Mode

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

mapred.job.tracker

虽然这通常指向具有多个节点的map-reduce集群,Hadoop还提供了一个很棒的选项,可以在用户的工作站上本地运行map-reduce作业。这对于在小型数据集上运行查询非常有用——在这种情况下,本地模式执行通常比向大型集群提交作业快得多。从HDFS透明地访问数据。相反,本地模式只运行一个reducer,处理较大的数据集可能非常慢。

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

 hive> SET mapreduce.framework.name=local;

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

从0.7版开始,Hive还支持在本地模式下自动运行map-reduce作业的模式。相关选项是hive.exec.mode.local.auto、  hive.exec.mode.local.auto.inputbytes.max、  hive.exec.mode.local.auto.tasks.max:

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

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

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

因此,对于小数据集上的查询,或者对于具有多个map-reduce作业的查询,其中后续作业的输入要小得多(由于前一个作业中的reduce /过滤),作业可以在本地运行。

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

Hive日志

Hive使用log4j进行日志记录。默认情况下,CLI不会将日志发送到控制台。默认的日志记录级别在0.13.0之前是警告。从Hive 0.13.0开始,默认日志级别是INFO。

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

  • /tmp/<user.name>/hive.log

注意:在本地模式下,Hive 0.13.0之前的日志文件名是“”。log而不是hive.log。这个bug在0.13.0版本中得到了修复(参见HIVE-5528和HIVE-5676)。

若要配置不同的日志位置,请设置hive.log。在HIVE_HOME美元/ conf / hive-log4j.properties dir。确保目录权限设置(chmod 1777 <dir>)。

  • hive.log.dir=<other_location>

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

  • bin/hive --hiveconf hive.root.logger=INFO,console  //用于HiveCLI (已废弃)
  • bin/hiveserver2 --hiveconf hive.root.logger=INFO,console

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

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

Hadoop集群上Hive执行期间的日志记录由Hadoop配置控制。通常Hadoop会为每个map生成一个日志文件,并减少存储在执行任务的集群机器上的任务。可以通过单击Hadoop JobTracker Web UI中的Task Details页面来获得日志文件。

当使用本地模式(使用mapreduce.framework.name=local)时,Hadoop/Hive执行日志在客户机上生成。从release 0.6开始——Hive使用Hive - execl -log4j。属性(回到hive-log4j。属性(仅当它丢失时)来确定默认情况下这些日志被交付到何处。默认配置文件为在本地模式下执行的每个查询生成一个日志文件,并将其存储在/tmp/<user.name>下。提供单独配置文件的目的是,如果需要,管理员可以集中执行日志捕获(例如,在NFS文件服务器上)。执行日志对于调试运行时错误非常有用。

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

错误日志对于调试问题非常有用。请将它们与任何bug(其中有许多bug !)一起发送到hive-dev@hadoop.apache.org。

从Hive 2.1.0开始(使用Hive -13027), Hive默认使用Log4j2的异步日志记录器。设置hive.async.log.enabled为false将禁用异步日志记录并退回到同步日志记录。异步日志记录可以显著提高性能,因为日志记录将在使用LMAX破坏者队列缓冲日志消息的单独线程中处理。请参考https://logging.apache.org/log4j/2.x/manual/async.html了解优点和缺点。

HiveServer2日志

HiveServer2操作日志从Hive 0.14开始对客户机可用。有关配置,请参见HiveServer2日志记录

审查日志

每次调用metastore API时,都会从Hive metastore服务器上记录下审计日志。

审计日志具有该函数,一些相关的函数参数记录在metastore 日志文件中。它记录在log4j的INFO级别,因此您需要确保启用了INFO级别的日志记录(参见HIVE-3505)。日志条目的名称是“HiveMetaStore.audit”。

Hive 0.7中添加了安全客户机连接的审计日志(Hive -1948), Hive 0.10中添加了非安全连接的审计日志(Hive -3277);也看到Hive - 2797)。

性能日志记录器

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

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

如果日志程序级别已经通过root. root设置为DEBUG。日志程序,要查看性能日志,不需要上述设置。

DDL 操作

Hive DDL操作是用Hive数据定义语言记录的。

创建Hive表

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

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

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

创建一个名为invite的表,其中包含两列和一个名为ds的分区列。分区列是一个虚拟列。它不是数据本身的一部分,而是从加载特定数据集的分区派生而来。

默认情况下,表被假定为文本输入格式,分隔符被假定为^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;

显示列的列表。

更改和删除表

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

  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列替换所有现有列,只更改表的模式,而不更改数据。表必须使用本机SerDe。REPLACE列也可以用于从表的模式中删除列:

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

删除表

hive> DROP TABLE pokes;

Metadata Store

Metadata是一个嵌入式Derby数据库,其磁盘存储位置由Hive配置变量 javax.jdo.option.ConnectionURL 决定。默认情况下,这个位置是./metastore_db (see conf/hive-default.xml).

现在,在默认配置中,这个元数据一次只能被一个用户看到。

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

将来,metastore本身可以成为一个独立的服务器。

如果希望将metastore作为网络服务器运行,以便可以从多个节点访问它,请参阅在服务器模式下使用Derby的Hive

数据操纵

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

从平面文件加载数据到Hive中

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

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

注:

  • 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分区创建,才能成功。

 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中找到。

更多信息可以在ql/src/test/queries/positive的Hive源代码中找到。

SELECTS and FILTERS

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

从invite表中分区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';

从invite表的分区ds=2008-08-15中选择所有行到HDFS目录中。结果数据在该目录中的文件中(取决于映射器的数量)。

注意:分区列(如果有的话)是使用*选择的。它们也可以在投影子句中指定。

  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> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

注意,对于不包含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(类似Hadoop流)在map阶段中传输数据。

类似地,流媒体也可以在reduce端使用(有关示例,请参阅Hive教程)。

简单的用例

MovieLens User Ratings

首先,创建一个以tab分隔的文本文件格式的表:

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

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

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上报告或发送一条消息到user@hive.apache.org邮件列表。

解压数据文件:

unzip ml-100k.zip

接着将下载的数据放入刚刚创建的表中:

LOAD DATA LOCAL INPATH '<path>/u.data'
OVERWRITE INTO TABLE u_data;
Count the number of rows in 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 Data

Apache weblog的格式是可定制的,而大多数web管理员使用默认格式。

对于默认的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;

 

参考地址:

https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-BuildingHivefromSource

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、关系运算: 4 1. 等值比较: = 4 2. 不等值比较: 4 3. 小于比较: < 4 4. 小于等于比较: 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP操作: REGEXP 7 二、数学运算: 7 1. 加法操作: + 7 2. 减法操作: - 7 3. 乘法操作: * 8 4. 除法操作: / 8 5. 取余操作: % 8 6. 位与操作: & 9 7. 位或操作: | 9 8. 位异或操作: ^ 9 9.位取反操作: ~ 10 三、逻辑运算: 10 1. 逻辑与操作: AND 10 2. 逻辑或操作: OR 10 3. 逻辑非操作: NOT 10 四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向上取整函数: ceiling 12 6. 取随机数函数: rand 12 7. 自然指数函数: exp 13 8. 以10为底对数函数: log10 13 9. 以2为底对数函数: log2 13 10. 对数函数: log 13 11. 幂运算函数: pow 14 12. 幂运算函数: power 14 13. 开平方函数: sqrt 14 14. 二进制函数: bin 14 15. 十六进制函数: hex 15 16. 反转十六进制函数: unhex 15 17. 进制转换函数: conv 15 18. 绝对值函数: abs 16 19. 正取余函数: pmod 16 20. 正弦函数: sin 16 21. 反正弦函数: asin 16 22. 余弦函数: cos 17 23. 反余弦函数: acos 17 24. positive函数: positive 17 25. negative函数: negative 17 五、日期函数 18 1. UNIX时间戳转日期函数: from_unixtime 18 2. 获取当前UNIX时间戳函数: unix_timestamp 18 3. 日期转UNIX时间戳函数: unix_timestamp 18 4. 指定格式日期转UNIX时间戳函数: unix_timestamp 18 5. 日期时间转日期函数: to_date 19 6. 日期转年函数: year 19 7. 日期转月函数: month 19 8. 日期转天函数: day 19 9. 日期转小时函数: hour 20 10. 日期转分钟函数: minute 20 11. 日期转秒函数: second 20 12. 日期转周函数: weekofyear 20 13. 日期比较函数: datediff 21 14. 日期增加函数: date_add 21 15. 日期减少函数: date_sub 21 六、条件函数 21 1. If函数: if 21 2. 非空查找函数: COALESCE 22 3. 条件判断函数:CASE 22 4. 条件判断函数:CASE 22 七、字符串函数 23 1. 字符串长度函数:length 23 2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格函数:trim 25 10. 左边去空格函数:ltrim 25 11. 右边去空格函数:rtrim 25 12. 正则表达式替换函数:regexp_replace 26 13. 正则表达式解析函数:regexp_extract 26 14. URL解析函数:parse_url 26 15. json解析函数:get_json_object 27 16. 空格字符串函数:space 27 17. 重复字符串函数:repeat 27 18. 首字符ascii函数:ascii 28 19. 左补足函数:lpad 28 20. 右补足函数:rpad 28 21. 分割字符串函数: split 28 22. 集合查找函数: find_in_set 29 八、集合统计函数 29 1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31 8. 总体标准偏离函数: stddev_pop 31 9. 样本标准偏离函数: stddev_samp 31 10.中位数函数: percentile 31 11. 中位数函数: percentile 31 12. 近似中位数函数: percentile_approx 32 13. 近似中位数函数: percentile_approx 32 14. 直方图: histogram_numeric 32 九、复合类型构建操作 32 1. Map类型构建: map 32 2. Struct类型构建: struct 33 3. array类型构建: array 33 十、复杂类型访问操作 33 1. array类型访问: A[n] 33 2. map类型访问: M[key] 34 3. struct类型访问: S.x 34 十一、复杂类型长度统计函数 34 1. Map类型长度函数: size(Map) 34 2. array类型长度函数: size(Array) 34 3. 类型转换函数 35
1. HIVE结构 Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数 据提取转化加载 (ETL),这是一种可以存储、 查询和分析存储在 Hadoop 中的大规模数据的 机制。 Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。 同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理 内建的 mapper 和 reducer 无法完成的复杂的分析工作。 1.1HIVE 架构 Hive 的结构可以分为以下几部分: 用户接口:包括 CLI, Client, WUI 元数据存储。通常是存储在关系数据库如 mysql, derby 中 6 解释器、编译器、优化器、执行器 Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算 1、 用户接口主要有三个: CLI,Client 和 WUI。其中最常用的是 CLI , Cli 启动的时候, 会同时启动一个 Hive 副本。 Client 是 Hive 的客户端,用户连接至 Hive Server 。 在启动 Client 模式的时候, 需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server 。 WUI 是通过浏览器访问 Hive 。 2、 Hive 将元数据存储在数据库中,如 mysql 、 derby 。 Hive 中的元数据包括表的名字, 表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 3、 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及 查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。 4、 Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比 如 select * from tbl 不会生成 MapRedcue 任务)。 1.2Hive 和 Hadoop 关系 Hive 构建在 Hadoop 之上, HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务,在 Hadoop 中执行(有些查询没有 MR 任 务,如: select * from table ) Hadoop和 Hive 都是用 UTF-8 编码的 7 1.3Hive 和普通关系数据库的异同 Hive RDBMS 查询语言 HQL SQL 数据存储 HDFS Raw Device or Local FS 索引 无 有 执行 MapReduce Excutor 执行延迟 高 低 处理数据规模 大 小 1. 查询语言。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计 了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开 发。 2. 数据存储位置。 Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中 的。而数据库则可以将数据保存在块设备或者本地文件系统中。 3. 数据格式。 Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数 据格式需要指定三个属性:列分隔符(通常为空格、” t ”、” x001″)、行分隔符 (” n”)以及读取文件数据的方法( Hive 中默认有三个文件格式 TextFile , SequenceFile 以及 RCFile )。由于在加载数据的过程中,不需要从用户数据格式到 Hive 定义的数据格式的转换,因此, Hive 在加载的过程中不会对数据本身进行任何修 改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数 据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储, 因此,数据库加载数据的过程会比较耗时。 4. 数据更新。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。 因此, Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。 而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO ... VALUES 添加数据,使用 UPDATE ... SET 修改数据。 5. 索引。之前已经说过, Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会 对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。 Hive 要访问数据中满足 条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引 入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问, Hive 仍然 可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特 定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较 高,决定了 Hive 不适合在线数据查询。 6. 执行。 Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的(类似 select * from tbl 的查询不需要 MapReduce)。而数据库通常有自己的执行引擎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值