Hive官方手册翻译(Getting Started)(转)

原文:http://slaytanic.blog.51cto.com/2057708/939950

翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的。如有疑问,请参照Hive官方文档对照查看。

内容列表

Cloudera制作的Hive介绍视频

安装与配置

系统需求

安装Hive发行版

从Hive源码编译

运行Hive

配置管理概览

运行时配置

Hive, Map-Reduce 与本地模式

错误日志

DDL 操作

元数据存储

DML 操作

SQL 操作

查询示例

SELECTS 和 FILTERS

GROUP BY

JOIN

MULTITABLE INSERT

STREAMING

Simple Example Use Cases

MovieLens User Ratings

Apache Weblog Data

免责声明: Hive目前仅在Unix(linux)和Mac系统下使用Java 1.6测试运行,可以在这些或类似的平台上正常运行。并不支持在Cygwin上工作(注:windows还是别想了)。

绝大部分的测试工作是基于Hadoop 0.20完成的 - 所以,我们建议不要使用其他版本,以避免编译或运行的异常。

Cloudera制作的Hive介绍视频

Hive 介绍视频

Hive 演示视频

安装与配置

系统需求

Java 1.6

Hadoop 0.20.x.(注:目前0.9.0支持hadoop 1.0.x)

用发行版安装Hive

使用下载工具从Apache下载镜像下载最近的Hive发行包(查看 Hive发行包)

下一步你需要解压缩Tar包,这将会创建一个名为hive-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 SVN 源: http://svn.apache.org/repos/asf/hive/trunk

$ svn co http://svn.apache.org/repos/asf/hive/trunk hive
$ cd hive
$ ant clean package
$ cd build/dist
$ ls
README.txt
bin/ (所有shell脚本)
lib/ (所需的jar文件)
conf/ (配置文件)
examples/ (示例输入与查询文件)

在接下来, 我们会交替的使用build/dist和<install-dir>.

运行Hive

Hive 使用Hadoop,这意味着:

你必须在PATH里面设置了hadoop路径 (注:原文是 you must have hadoop in your path,我认为这个path应该是大写的)  或者

export HADOOP_HOME=<hadoop-install-dir>

作为附加的, 你必须在创建Hive库表前,在HDFS上创建/tmp和/user/hive/warehouse,并且将它们的权限设置为chmod g+w.

完成这个操作的命令如下:

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

在Shell中使用Hive命令行(cli)模式:

$ $HIVE_HOME/bin/hive

配置文件管理概述

Hive 默认的配置文件保存在 <install-dir>/conf/hive-default.xml

你可以修改其中的配置,并重命名这个文件为 <install-dir>/conf/hive-site.xml(注:我建议你还是保留原始配置文件)

Hive配置文件的位置可以通过设置HIVE_CONF_DIR环境变量来改变.

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

Hive的配置存在于Hadoop之上,这意味着Hadoop的配置默认会被继承到Hive中.

Hive 配置可以被如下方式控制:

编辑 hive-site.xml 并定义任何需要的变量 (包括hadoop的变量)

从 cli 模式使用使用set命令 (看下面)

使用如下方式:

$ bin/hive -hiveconf x1=y1 -hiveconf x2=y2

这个例子分别设置了变量x1为y1,x2为y2

设置使用 HIVE_OPTS 环境变量 "-hiveconf x1=y1 -hiveconf x2=y2" 与上面的功能相同

运行时配置

Hive 查询是执行map-reduce查询,并且,这些查询是可以被hadoop的配置所控制的.

命令行命令 ‘SET‘ 可以被用来设置任何hadoop(或者hive)的配置变量,例如:

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

后者(注 SET -v)用来查看当前全部的设置. 而不使用 -v 选项,则是用来查看当前与Hadoop不同的配置.

Hive, Map-Reduce 与本地模式

Hive编译器会为绝大多数查询生成map-reduce的jobs。这些Jobs使用下面这个变量来表明被提交到Map-Reduce集群中:

mapred.job.tracker

由于这通常是在一个多节点的map-reduce集群中被指出,Hadoop同样有个就近的方式来在用户的工作机上运行map-reduce jobs。这就在小数据集的查询上显得非常有用 - 在这种情况下,本地模式运行通常会比将任务提交到整个大集群中查询更快。数据从HDFS上获取是透明的。同样的,由于本地模式仅运行一个reducer,这样,在大数据查询上是非常慢的。

从 0.7 版本开始, Hive全面支持本地运行模式,要使用这个模式,请按照下列进行设置:

hive> SET mapred.job.tracker=local;

作为附加的,mapred.local.dir应该指定一个合法的本机路径(注:安装hive的那台服务器) (例如: /tmp/<username>/mapred/local). (否则,用户将获取一个定位本地空间的异常抛出).

从0.7版本开始, Hive同样支持自动/非自动地使用本地模式来完成map-reduce jobs,相关的选项是:

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

请注意这个功能默认是关闭的,如果打开 - Hive将分析每一个查询的map-reduce job ,并且如果以下阀值被确认为OK,就尝试运行在本地:

全部job的输入大小低于: hive.exec.mode.local.auto.inputbytes.max (128MB 默认)

全部的map任务数低于: hive.exec.mode.local.auto.tasks.max (4 个默认)

全部reduce任务数等于 1 或者 0.

对于查询大于小数据集,或者需要查询在多个map-reduce jobs中完成,但是子查询很小的(注:小于上述条件),jobs仍可能使用本地模式来运行。

注意,可能不同的hadoop服务器节点和hive客户端的运行时环境(由于不同的jvm版本或者不同的软件库)。运行本地模式可能会导致一个不可被捕获的错误。同样需要注意的是,本地运行模式是在一个独立的子jvm(hive 客户端的子进程)中完成的。 如果用户希望,子jvm所能使用的最大内存数,可以通过访问hive.mapred.local.mem来进行控制。默认设置是0,所以Hive允许Hadoop来决定子jvm的默认内存限制

错误日志

Hive 使用 log4j 来记录日志. 默认来说,日志不会被返回到CLI模式的控制台上(注:也就是CRT中)。默认的日志记录等级是WARN,并被保存到以下文件夹中:

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

如果用户愿意 - 日志可以通过修改下面的参数来返回到控制台上:

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

另外,用户可以改变记录等级:

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

注意,配置项 hive.root.logger 在hive初始化以后,即不能通过使用‘set‘命令来改变了

Hive同样会为每个hive会话保存查询日志,在/tmp/<user.name>/ (注:本机路径下),但是可以通过修改 hive-site.xml 中的 hive.querylog.location属性来变更。

Hive在一个hadoop集群上运行过程中的日志是由Hadoop的配置所决定的。通常Hadoop会为每个map和reduce任务创建日志文件,并保存在运行任务的集群服务器上。日志文件可以通过Hadoop Jobtracker提供的Web UI上的Task Detail页面来跟踪观察。

运行本地模式时(mapred.job.tracker=local),Hadoop/Hive 将会将执行日志放在本机上,从0.6版本开始 - Hive使用hive-exec-log4j.properties (如果不存在,则是使用hive-log4j.properties文件)来决定默认的日志的保存方式。默认的配置文件将为每个查询执行在本地模式下的日志放到/tmp/<user.name>。这样做的目的是为了将配置单独管理,并可以将日志集中存放到一个用户需要的位置(例如一个NFS文件服务器)上。执行日志对于运行时错误的debug并无帮助。

错误日志对于定位问题非常有用,请将存在的任何bug发送到[email protected]

DDL 操作

创建Hive表和查看使用

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

创建一个包含两个字段,名称为pokes的表,第一个字段是int(注:整型),第二个字段是string(注:字符串)

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

创建一个名为invites的表,其中包含两个字段和一个叫做ds的分区(partition)字段. 分区字段是一个虚拟的字段,本身并不包含在数据中,但是是从加载进来的数据中特别衍生出来的数据集.

默认情况下,表被假定是纯文本的格式,并且使用^A(ctrl-a)来作为数据分割的。

hive> SHOW TABLES;

列出所有的表

hive> SHOW TABLES ‘.*s‘;

列出所有结尾包含 ‘s‘ 的表名。匹配方式使用Java正则表达式,查看下列连接获取关于Java正则的信息  http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

hive> DESCRIBE invites;

查看invites表的全部字段

可以修改表名,增加删除新的字段等:

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT ‘a comment‘);
hive> ALTER TABLE events RENAME TO 3koobecaf;

删除表:

hive> DROP TABLE pokes;

元数据存储

元数据默认使用Derby数据库保存在本地文件系统中,并保存在./metastore_db下。通过修改conf/hive-default.xml中的javax.jdo.option.ConnectionURL变量修改。

当前,在默认配置下,元数据每次只能同时被一个用户所使用。

元数据可以存储在任何一个使用JPOX支持的数据库中,这些关系型数据库的连接和类型可以通过两个变量进行控制。javax.jdo.option.ConnectionURL 和 javax.jdo.option.ConnectionDriverName。

你需要查看数据库的JDO(或JPOX)手册来获取更多信息。

数据库的Schema定义在JDO元数据注释文件package.jdo中,位置在src/contrib/hive/metastore/src/model。

计划在未来,元数据存储引擎可以成为一个独立的服务。

如果你想将元数据作为一个网络的服务来在多个节点中访问,请尝试HiveDerbyServerMode.

DML 操作

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

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

加载到pokes表的文件包含两个用ctrl-a符号分割的数据列,‘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表的分区(partition)中。invites表必须事先使用 ds 创建好partition。

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

上述命令是将HDFS上的文件加载到表中。

注意从HDFS中加载数据,将会把数据移动到目录下。这几乎是瞬间完成的。(注:因为只是在HDFS元数据中修改了文件路径的指向。)

SQL 查询

查询示例

下面会演示一些查询范例,在build/dist/examples/queries中可以找到。

更多的,可以在hive源码中的 ql/src/test/queries/positive中可以找到。

SELECTS 和 FILTERS

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

从invite表的字段 ‘foo‘ 中选择所有分区ds=2008-08-15的结果。这些结果并不存储在任何地方,只在控制台中显示。

注意:下面的示例中,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目录中。结果数据在在/tmp/hdfs_out目录中的文件(多个文件,文件数量取决于mapper的数量)。

存在分区的表在使用 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;

字段计算和,最大值,最小值同样可以使用,注意不包含在 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‘;

在map中使用脚本/bin/cat对数据的流式访问(就像使用hadoop的streaming)

同样的 - 流式访问也可以使用在reduce阶段。(请查看 Hive Tutorial 范例)

简单的使用范例

用户对电影的投票统计

首先,创建一个使用tab分割的文本文件的表

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

然后,下载这个数据文件

wget http://www.grouplens.org/system/files/ml-data.tar+0.gz

tar xvzf ml-data.tar+0.gz

将这个文件加载到刚刚创建的表中:

LOAD DATA LOCAL INPATH ‘ml-data/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;

注意 0.5.0 及更早的的Hive版本,你需要使用COUNT(1) 来代替 COUNT(*)

Apache Web日志数据

Apache日志格式是可以自定义的,作为大多数网管来说都是使用默认设置。

我们可以给默认的Apache日志创建一个如下的表

更多的关于正则序列化/反序列化(注: 原文!RegexSerDe) 可以在这里看到。

http://issues.apache.org/jira/browse/HIVE-662

add jar ../build/contrib/hive_contrib.jar;
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.contrib.serde2.RegexSerDe‘
WITH SERDEPROPERTIES (
        "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?",
        "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;

时间: 2024-10-09 11:18:17

Hive官方手册翻译(Getting Started)(转)的相关文章

Hive 官方手册翻译 -- Hive DDL(数据定义语言)

Hive DDL(数据定义语言) Confluence Administrator创建, Janaki Lahorani修改于 2018年9月19日 原文链接 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 翻译:Google Google翻译,金山软件 金山词霸 校对:南大通用 范振勇 (2018.9.26) 一.概述 这里是HiveQL DDL语句的文档,其中包括: CREATE 数据库/SCHEMA,表

Hive 官方手册翻译 -- Hive DML(数据操纵语言)

由 Confluence Administrator创建, 最终由 Lars Francke修改于 八月 15, 2018 原文链接 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML 翻译:Google Google翻译,金山软件 金山词霸 校对:南大通用 范振勇 (2018.10.6) 在Hive中,有多种方式修改数据: LOAD INSERT 从查询到目标表 从查询到目录 成从SQL蜂巢表 UPDATE D

Hive官方手册翻译(Getting Started)

翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的.如有疑问,请参照Hive官方文档对照查看. 内容列表 Cloudera制作的Hive介绍视频 安装与配置 系统需求 安装Hive发行版 从Hive源码编译 运行Hive 配置管理概览 运行时配置 Hive, Map-Reduce 与本地模式 错误日志 DDL 操作 元数据存储 DML 操作 SQL 操作 查询示例 SELECTS 和 FILTERS GROUP BY JOIN MULTITABL

Hive 官方手册翻译 -- Hive Transactions (Hive 事务)

由 Alan Gates创建, 最终由 Andrew Sherman修改于2018年8月7日 原文链接:https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions 翻译:Google Google翻译,金山软件 金山词霸 校对:南大通用 范振勇 (如有翻译问题,请多指教) 一.Hive 3的警告 升级到Hive 3.0时,由之前版本创建的任何事务性表都需要在每个分区上运行Major(主要/深度)级紧缩操作.更确切地说,自上

Swift编程语言(中文版)官方手册翻译(第一部分)

独立翻译,进度会比较慢.等不及的可以看CocoaChina翻译小组,他们也正在组织翻译,而且人手众多,相信会提前很多完成翻译.当然质量就见仁见智了.原文可以在iTunes免费下载 目前进度 4 JUN 2014:6.5 % 前言 今天Apple发布了新的编程语言Swift,也提供了一本将近400页的 The Swift Programming Language(Swift编程语言).虽然我没有开发者账号,没法实际上机练习Swift代码,但这不影响我阅读这本书,以及用铅笔在纸上运行这些小程序.Ap

翻译:last_value()函数(已提交到MariaDB官方手册)

本文为mariadb官方手册:LAST_VALUE()的译文. 原文:https://mariadb.com/kb/en/last_value/我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh-cn/last_value/ 语法 LAST_VALUE(expr,[expr,...]) 描述 LAST_VALUE()对所有表达式求值,并返回最后一个值. 这在结合使用@var:=expr为变量赋值时很有用.例如,当你想要从updated/deleted的行中获

翻译:SET Variable(已提交到MariaDB官方手册)

本文为mariadb官方手册:SET Variable的译文. 原文:https://mariadb.com/kb/en/set-variable/我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh-cn/set-variable/ 语法 SET var_name = expr [, var_name = expr] ... 存储程序stored programs中的SET语句是普通SET语句的一个扩展功能. 变量引用的时候,可以引用存储程序内部.全局系统变

翻译:DECLARE Variable(已提交到MariaDB官方手册)

本文为mariadb官方手册:DECLARE Variable的译文. 原文:https://mariadb.com/kb/en/library/declare-variable/我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh-cn/declare-variable/ 语法: DECLARE var_name [, var_name] ... type [DEFAULT value] 描述 该语句用在该语句用来在存储程序stored programs中声

翻译:DECLARE HANDLER语句(已提交到MariaDB官方手册)

本文为mariadb官方手册:DECLARE HANDLER的译文. 原文:https://mariadb.com/kb/en/library/declare-handler/我提交到MariaDB官方手册的译文:https://mariadb.com/kb/zh-cn/declare-handler/ 回到Linux系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 回到网站架构系列文章大纲:http://www.cnblogs.c