Hive怎么用

这篇文章主要介绍了Hive怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

创新互联建站凭借专业的设计团队扎实的技术支持、优质高效的服务意识和丰厚的资源优势,提供专业的网站策划、网站建设、成都网站设计、网站优化、软件开发、网站改版等服务,在成都十余年的网站建设设计经验,为成都近千家中小型企业策划设计了网站。

#简介#

Apache 顶级项目Hive数据仓库软件便于查询和管理驻留在分布式存储上的大型数据集.他提供了:

  • 能够进行简单的数据提取/转换/加载(ETL)的工具

  • 一种使各种各样的数据格式结构化的机制

  • 访问直接存储在Apache HDFS上的文件或者其他数据存储系统上的文件例如的Apache HBase

  • 通过MapReduce执行查询

Hive定义了一种简单的类似SQL的语言,叫做QL。它使熟悉SQL语句的用户可以查询数据。同时,这种语言也可以使熟悉MapReduce框架的编程人员通过插入他们自定义的map和reduce来执行更加复杂的这种语言内置功能不支持的复杂分析。QL也可以使用自定义的标量函数(UDF's),聚合函数(UDAF's)和表函数(UDTF's)扩展。

Hive并不强制数据读写使用“Hive format"--没有这样的事。Hive在Thrift上工作的同样很好,控制分离,或者你的特殊的数据格式。Please see File Formats and Hive SerDe in the Developer Guide for details.

Hive的设计不适合OLTP,也没有提供实时的查询和row级别的更新。它最擅长用于大型仅追加的数据集(就像web日志)的批量job。Hive最看重的是他的伸缩性(使用更多的及其动态的添加到Hadoop集群进行扩展),可扩展性(使用MapReduce框架和UDF/UDAF/UDTF),容错性,和对于他的输入格式的低耦合行。

Hive的组建包括HCatalog和WebHCat,HCatalog是Hive的一个组件。它是Hadoop的一个表和存储管理层,是用户能够使用不同的数据处理工具,包括Pig和MapReduce,来更加方便的在Grid上读写数据。

WebHCat提供一个服务,你可以使用它运行Hadoop MapReduce(或者YARN),Pig,Hive job,或者使用HTTP(RESTFul风格)接口执行Hive元数据操作。

#安装和配置# 你可以通过下载压缩包安装Hive的稳定版本,或者你可以下载Hive的源代码并从中构建Hive。

##必要条件##

  • Java 1.6

  • Hadoop 0.20.x, 0.23.x, or 2.0.x-alpha

##从一个稳定的版本安装Hive## 首先从Apache的下载镜像下载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

##运行Hive## Hive使用Hadoop,所以:

  • 你需要添加Hadoop到你的PATH,或者

  • export HADOOP_HOME=

此外,在你zaiHive中创建一个表之前,你必须在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=

在shell下使用Hive的命令行接口(CLI):

$ $HIVE_HOME/bin/hive

#DDL操作# Hive的DDL操作都记录在 Hive Data Definition Language.

###创建Hive表###

CRATE TABLE pokes (foo INT,bar STRING);

创建一个拥有两列的叫做pokes的表,第一列是一个integer,第二列是一个String。

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

创建一个表invites,它有两列和一个叫做ds的分区列。分区列是一个虚拟的列。它不是数据自身的一部分,而是来自一个特殊的数据集被加载到分区。

默认情况下,表设定输入格式为text,分隔符假定为^A(ctrl-a).

###浏览表###

SHOW TABLES;

列出所有表。

SHOW TABLES '.*S';

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

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)

现在,在默认配置下,元数据只能在某一时刻被某一用户访问。

元数据可以存储在任何支持JPOX的数据库中。

#DML 操作# Hive DML 操作文档在 Hive Data Manipulation Language.

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

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

加载一个包含两个列的使用ctrl-a分割的文件到表pokes。'LOCAL'标志着这里的输入文件在本地文件系统上,如果“LOCAL‘缺省将会在HDFS上寻找文件。

关键字'OVERWRITE'标志着这个表中已存在的数据会被删除。如果“OVERWRITE”缺省,数据文件将会追加到已存在的数据集。

注意:

  • NO verification of data against the schema is performed by the load command.

  • If the file is in hdfs, it is moved into the Hive-controlled file system namespace. The root of the Hive directory is specified by the option hive.metastore.warehouse.dir in hive-default.xml. We advise users to create this directory before trying to create tables via 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');

上面的两个加载语句加载数据到表invites的两个不同的分区。表invites必须在创建时使用key ds分区,是这个操作能够成功。

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

上面的命令将加载HDFS file/directory 上的数据到表中。

注意从HDFS上加载数据将导致移动 file/directory。作为结果,这个操作几乎时瞬时的。

#SQL 操作# Hive查询操作文档记录在Select.

##查询示例## 下面是一些查询的展示,他们可以在build/dist/examples/queries找到。

更多的例子可以在Hive源码的ql/src/test/queries/positive找到。

##SELECT 和FILTERS##

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目录。查询结果存储在这个目录下的文件(依赖于mapper的数量)中。

注意:partition columns if any are selected by the use of *. They can also be specified in the projection clauses. Partitioned tables must always have a partition selected in the WHERE clause of the statement.

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,不包括在HIVE-287中的,你需要使用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;
 ive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

注意旧版本的Hive,不包括在HIVE-287中的,你需要使用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 streaming)在map阶段流失化数据。

类似的——流可以在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页面(其中也有一个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 datasets不可用,请在[HIVE-5341]报告这个问题,或者发送一个消息给user@hive.apache.org 邮件组.

解压这个数据文件:

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,不包括HIVE-287,你需要使用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(floa(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;

注意如果你使用Hive0.5.0或者之前的版本,你需要使用COUNT(1)替换COUNT(*)。

##Apache Weblog 数据## 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;

感谢你能够认真阅读完这篇文章,希望小编分享的“Hive怎么用”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


文章名称:Hive怎么用
网站网址:http://azwzsj.com/article/jdpheh.html