文档章节

Hive详细教程

simpler
 simpler
发布于 2014/04/29 00:02
字数 2668
阅读 30455
收藏 186




为什么选择Hive?


基于Hadoop的大数据的计算/扩展能力

支持SQL like查询语言

统一的元数据管理

简单编程

Hive的安装

1.1在hadoop生态圈中属于数据仓库的角色。他能够管理hadoop中的数据,同时可以查询hadoop中的数据。

  本质上讲,hive是一个SQL解析引擎。Hive可以把SQL查询转换为MapReduce中的job来运行。

  hive有一套映射工具,可以把SQL转换为MapReduce中的job,可以把SQL中的表、字段转换为HDFS中的文件(夹)以及文件中的列。

  这套映射工具称之为metastore,一般存放在derby、mysql中。

1.2 hive在hdfs中的默认位置是/user/hive/warehouse,是由配置文件hive-conf.xml中属性hive.metastore.warehouse.dir决定的。

2.hive的安装

  (1)解压缩、重命名、设置环境变量

  (2)在目录$HIVE_HOME/conf/下,执行命令mv hive-default.xml.template  hive-site.xml重命名

     在目录$HIVE_HOME/conf/下,执行命令mv hive-env.sh.template  hive-env.sh重命名

  (3)修改hadoop的配置文件hadoop-env.sh,修改内容如下:

     export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin

  (4)在目录$HIVE_HOME/bin下面,修改文件hive-config.sh,增加以下内容:

     export JAVA_HOME=/usr/local/jdk

     export HIVE_HOME=/usr/local/hive

     export HADOOP_HOME=/usr/local/hadoop

3.安装mysql

  (1)删除linux上已经安装的mysql相关库信息。rpm  -e  xxxxxxx   --nodeps

     执行命令rpm -qa |grep mysql 检查是否删除干净

  (2)执行命令 rpm -i   mysql-server-********  安装mysql服务端 

  (3)启动mysql 服务端,执行命令  mysqld_safe &

  (4)执行命令 rpm -i   mysql-client-********  安装mysql客户端

  (5)执行命令mysql_secure_installation设置root用户密码

4. 使用mysql作为hive的metastore

  (1)把mysql的jdbc驱动放置到hive的lib目录下

  (2)修改hive-site.xml文件,修改内容如下:  

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop0:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>admin</value>
</property>


   

•用户接口,包括 CLI,JDBC/ODBC,WebUI

•元数据存储,通常是存储在关系数据库如 mysql, derby 中

•解释器、编译器、优化器、执行器

•Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算



用户接口主要有三个:CLIJDBC/ODBC和 WebUI

.CLI,即Shell命令行

.JDBC/ODBC是 Hive Java,与使用传统数据库JDBC的方式类似

.WebGUI是通过浏览器访问 Hive

Hive 将元数据存储在数据库中(metastore),目前只支持mysqlderbyHive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等

解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS 中,并在随后有 MapReduce 调用执行

Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from table 不会生成 MapRedcue 任务)

Hive的metastore


metastore是hive元数据的集中存放地。metastore默认使用内嵌的derby数据库作为存储引擎

Derby引擎的缺点:一次只能打开一个会话

使用Mysql作为外置存储引擎,多用户同时访问 

Hive的shell

1hive 命令行模式,直接输入#/hive/bin/hive的执行程序,或者输入#hive --service cli

2、 hive web界面的 (端口号9999) 启动方式

#hive --service hwi&

用于通过浏览器来访问hive

http://hadoop0:9999/hwi/

3、 hive 远程服务 (端口号10000) 启动方式

#hive --service hiveserver&


Hive与传统数据库

查询语言

HiveQL

SQL

数据存储位置

HDFS

Raw  Device or 本地FS

数据格式

用户定义

系统决定

数据更新

不支持

支持

索引

新版本有,但弱

执行

MapReduce

Executor

执行延迟

可扩展性

数据规模


Hive的数据类型

基本数据类型
tinyint / smalint / int /bigint
float / double
boolean
string
复杂数据类型
Array/Map/Struct
没有date /datetime 


Hive的数据存储

Hive的数据存储基于Hadoop HDFS

Hive没有专门的数据存储格式

存储结构主要包括:数据库、文件、表、视图

Hive默认可以直接加载文本文件(TextFile),还支持sequence file

创建表时,指定Hive数据的列分隔符与行分隔符,Hive即可解析数据


Hive的数据模型-内部表


与数据库中的 Table 在概念上是类似

每一个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表test,它在 HDFS 中的路径为:/ warehouse/test。 warehouse是在hive-site.xml 中由 ${hive.metastore.warehouse.dir} 

指定的数据仓库的目录

所有的 Table 数据(不包括 External Table)都保存在这个目录中。

删除表时,元数据与数据都会被删除


Hive的数据模型-分区表

Partition 对应于数据库的 Partition 列的密集索引

在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中

例如:test表中包含 date 和 city 两个 Partition,

则对应于date=20130201, city = bj 的HDFS 子目录

/warehouse/test/date=20130201/city=bj

对应于date=20130202, city=sh 的HDFS 子目录为;

/warehouse/test/date=20130202/city=sh


CREATE TABLE tmp_table #表名

(

title   string, #字段名称 字段类型

minimum_bid     double,

quantity        bigint,

have_invoice    bigint

)COMMENT'注释:XXX' #表注释

 PARTITIONED BY(ptSTRING) #分区表字段(如果你文件非常之大的话,采用分区表可以快过滤出按分区字段划分的数据)

 ROW FORMAT DELIMITED

   FIELDSTERMINATED BY '\001'   字段是用什么分割开的

STOREDAS SEQUENCEFILE; #用哪种方式存储数据,SEQUENCEFILEhadoop自带的文件压缩格式


一些相关命令

SHOW TABLES#查看所有的表

SHOW TABLES '*TMP*'#支持模糊查询

SHOWPARTITIONS TMP_TABLE#查看表有哪些分区

DESCRIBE TMP_TABLE#查看表结构

分区表的shell


创建数据文件partition_table.dat

创建表

create table partition_table(rectime string,msisdnstring) partitioned by(daytime string,citystring) row format delimited fields terminated by '\t' stored as TEXTFILE;


加载数据到分区


load data local inpath'/home/partition_table.dat' into table partition_tablepartition (daytime='2013-02-01',city='bj');


查看数据


select * from partition_table


select count(*) from partition_table


删除表 drop table partition_table



Hive的数据模型—桶表

桶表是对数据进行哈希取值,然后放到不同文件中存储。

创建表create table bucket_table(id string) clustered by(id) into 4 buckets; 加载数据set hive.enforce.bucketing = true;

insert into table bucket_table select name from stu; 

insert overwrite table bucket_table select name from stu;

数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。


抽样查询

select * from bucket_table tablesample(bucket 1 out of 4 on id);


Hive的数据模型-外部表

指向已经在 HDFS 中存在的数据,可以创建 Partition

它和 内部表 在元数据的组织上是相同的,而实际数据的存储则有较大的差异

内部表 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据

仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除

外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个链接。当删除一个外部表时,仅删除链接

CREATEEXTERNAL TABLE page_view


( viewTimeINT,

  useridBIGINT,

  page_urlSTRING,  

  referrer_urlSTRING,  

  ipSTRING COMMENT 'IP Address of the User',

  country STRING COMMENT 'country of origination‘

)
   
    COMMENT 'This is the staging page view table'


    ROW FORMAT DELIMITED FIELDSTERMINATED BY '44' LINES   TERMINATED BY '12'

    STORED ASTEXTFILE

    LOCATION 'hdfs://centos:9000/user/data/staging/page_view';



外部表的shell  

创建数据文件external_table.dat

创建表

hive>create external table external_table1 (key string) ROW FORM   AT  DELIMITED FIELDS TERMINATED BY '\t' location '/home/external';


HDFS创建目录/home/external


#hadoop fs -put /home/external_table.dat /home/external

加载数据

LOAD DATA INPATH '/home/external_table1.dat' INTO TABLE external_table1;


查看数据

select * from external_table


select count(*) from external_table


删除表

drop table external_table



导入数据


当数据被加载至表中时,不会对数据进行任何转换。Load 操作只是将数据复制/移动至 Hive 表对应的位置

 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]
    INTO TABLE tablename
    [PARTITION (partcol1=val1, partcol2=val2 ...)]

把一个Hive表导入到另一个已建Hive表

 INSERT OVERWRITE TABLE tablename[PARTITION (partcol1=val1, partcol2=val2 ...)] select_statementFROM from_statement

CTAS

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

  (col_namedata_type, ...)  …

  AS SELECT …

例:create table new_external_testas  select * from external_table1

查询


基于Partition的查询 

一般 SELECT查询是全表扫描。但如果是分区表,查询就可以利用分区剪枝(input pruning)的特性,类似“分区索引“”,只扫描一个表中它关心的那一部分。Hive当前的实现是,只有分区断言(Partitioned by)出现在离FROM子句最近的那个WHERE子句中,才会启用分区剪枝。例如,如果page_views表(按天分区)使用date列分区,以下语句只会读取分区为‘2008-03-01’的数据。

 SELECT page_views.*    FROM page_views    WHERE page_views.date>= '2013-03-01' AND page_views.date<= '2013-03-01'

LIMIT Clause

Limit可以限制查询的记录数。查询的结果是随机选择的。下面的查询语句从t1表中随机查询5条记录:

SELECT * FROM t1 LIMIT 5

Top N查询

下面的查询语句查询销售记录最大的5个销售代表。

SETmapred.reduce.tasks= 1
SELECT * FROM sales SORT BY amount DESC LIMIT 5

表连接



导入ac信息表

hive> create table acinfo(name string,acipstring)  row format delimited fields terminated by '\t' stored as TEXTFILE;

hive> load data local inpath'/home/acinfo/ac.dat' into table acinfo;

内连接

select b.name,a.* from dim_acjoin acinfo b on (a.ac=b.acip) limit 10;

左外连接

select b.name,a.* from dim_ac a left outer join acinfo b on a.ac=b.acip limit 10;




Java客户端

Hive远程服务启动#hive --service hiveserver>/dev/null  2>/dev/null &

JAVA客户端相关代码

Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive://192.168.1.102:10000/wlan_dw", "", "");
Statement stmt = con.createStatement();
String querySQL="SELECT * FROM wlan_dw.dim_m order by flux desc limit 10";
ResultSet res = stmt.executeQuery(querySQL); 
while (res.next()) {
System.out.println(res.getString(1) +"\t" +res.getLong(2)+"\t" +res.getLong(3)+"\t" +res.getLong(4)+"\t" +res.getLong(5));
}




UDF




1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。

2、编写UDF函数的时候需要注意一下几点:

a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。

b)需要实现evaluate函数,evaluate函数支持重载。

4、步骤

a)把程序打包放到目标机器上去;

b)进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar;

c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

d)查询HQL语句:

SELECT add_example(8, 9) FROM scores;

SELECT add_example(scores.math, scores.art) FROM scores;

SELECT add_example(6, 7, 8, 6.8) FROM scores;

e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;

注:UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF

 

© 著作权归作者所有

simpler
粉丝 25
博文 44
码字总数 40338
作品 0
成都
程序员
私信 提问
加载中

评论(7)

b
bomboom
Hive详解及实战
课程下载地址:https://pan.baidu.com/s/129keYtHlFOM8ijQR8trQQA
提取码:koiq

课程由浅入深,介绍了Hive基本架构及环境部署,带领大家认识数据仓库Hive的优势及Hive具体使用。并通过企业实际需求分析,讲解HiveQL中的DDL和DML的使用,以及常见的性能优化方案。
我来保护你
Hive详解及实战
课程学习地址:http://www.xuetuwuyou.com/course/187
课程出自学途无忧网:http://www.xuetuwuyou.com

课程简介:
课程由浅入深,介绍了Hive基本架构及环境部署,带领大家认识数据仓库Hive的优势及Hive具体使用。并通过企业实际需求分析,讲解HiveQL中的DDL和DML的使用,以及常见的性能优化方案。

课程目录:
第1章:Hive基本架构及环境部署
1.MapReduce分析与SQL分析对比
2.Hive的介绍及其发展
3.Hive的安装部署及启动
4.Hive的基本架构讲解
5.安装MySQL作为元数据库存储
6.配置Hive使用MySQL作为元数据库存储
7.Hive中基本命令的使用
8.Hive中常用的属性配置
9.Hive中常用的交互式命令
10Hive中数据库的管理与使用
11.Hive中表的管理与使用
12.Hive中外部表的使用

第2章:Hive 常用DML、UDF及连接方式
13.Hive中分区表的介绍
14.Hive中分区表的创建及使用
15.Hive中数据导入的6种方式及其应用场景
16.Hive中数据导出的4种方式及表的导入导出
17.Hive中HQL的基本语法(一)
18.Hive中HQL的基本语法(二)
19.Hive中order by、sort by、distribute by与cluster by的使用
20.Hive中分析函数与窗口函数
21.Hive中UDF的介绍
22.Hive中使用自定义UDF实现日期格式转换
23. HiveServer2的介绍及三种连接方式
24.Hive元数据、fetch task和严格模式的介绍

第3章:Sqoop Sqoop及用户行为分析案例
25.CDH版本框架的介绍
26. CDH版本框架的环境部署
27.Sqoop的介绍及其实现原理
28.Sqoop的安装部署及连接测试
29.Sqoop将MySQL数据导入到HDFS(一)
30.Sqoop将MySQL数据导入到HDFS(二)
31.Sqoop中的增量导入与Sqoop job
32.Sqoop将MySQL数据导入Hive表中
33.Sqoop的导出及脚本中使用的方式
34.案例分析-动态分区的实现
zhangnew
zhangnew

引用来自“蒙蒙一号”的评论

Mark, thanks.

引用来自“simpler”的评论

mark?
mark 就是留名,标记一下,收藏一下
simpler
simpler 博主

引用来自“蒙蒙一号”的评论

Mark, thanks.
mark?
蒙蒙一号
蒙蒙一号
Mark, thanks.
simpler
simpler 博主

引用来自“进击的代码”的评论

先收藏了,放假仔细拜读一下.顺便说下HIVE瞬间想起生化危机的基地
呵呵,hadoop一家子的起名都比较奇葩....
进击的代码
进击的代码
先收藏了,放假仔细拜读一下.顺便说下HIVE瞬间想起生化危机的基地
关于hive和spark日志问题

在用控制台学习hive和spark的时候,总是打印出来的各种日志烦得不行(对我而言)。所以就想把着写我不关心的信息屏蔽掉,只保留错误信息。其实输出的日志信息还是很有用的,因为里面的日志信...

DragonRiver2015
2015/06/19
205
0
azkaban使用教程

登录 https://localhost:8443 注意是https,采用的是jetty ssl链接。输入账号密码azkaban/azkanban(如果你之前没有更改的话) 首页有四个菜单 projects:最重要的部分,创建一个工程,所有f...

张欢19933
2016/11/23
1K
0
Hive(2.1.0)配置过程

1、解压hive到hadoop的source目录下 2、配置环境变量 3、配置教程参考地址:http://www.cnblogs.com/bjtu-leefon/p/3170044.html (不能完全参考) 1)更改用户权限。在终端中输入如下命令: ...

源子
2016/10/12
590
0
Apache Hive 0.8.1 发布,数据仓库平台

Hive 0.8.1发布,该版本修复了一些bug,详细请见:https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310843&version=12319268 Bug [HIVE-2616] - Passing user identit......

彭博
2012/02/06
1K
0
pyspark连接hive报错:"Error while instantiating 'org.apache.spark.sql.hive.HiveExternalCatalog':"

spark-env.sh: 已配置HADOOPHOME,HADOOPCONFDIR,HIVEHOME,HIVECONFDIR,SPARK_CLASSPATH spark-defaults.conf: spark.yarn.dist.files $SPARK_HOME/conf/hive-site.xml spark.sql.hive.me......

lily525
01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部