一、hive的基本概念
1.1 hive是什么?
(1)hive是建立在hadoop数据仓库基础之上的一个基础架构;
(2)相当于hadoop之上的一个客户端,可以用来存储、查询和分析存储在hadoop中的数据;
(3)是一种sql解析引擎,能够将sql转换成map/reduce中的job在hadoop上执行。
1.2 hive的数据存储特点
(1)数据存储是基于hadoop的hdfs;
(2)没有专门的数据存储格式;
(3)存储结构主要有:数据库、文件(默认可以直接加载文本文件)、表、视图、索引;
说明:hive中的表实质就是hdfs的目录,按表名将文件夹分开,若是分区表,则分区值是子文件夹。这些数据可以直接在m/r中使用。hive中的数据是存放在hdfs中的。
二、hive的系统结构
存储hive的元数据(表及表的属性、数据库名字等)
分析执行hive ql语句,将执行计划投递给hadoop,转到map/reduce执行
2.1 hive的系统结构– metastore存储方式
默认情况,元数据使用内嵌的derby数据库作为存储引擎
将存储数据独立出来,支持多用户同时访问
将metastore独立出来,远程方法调用
三、hive的安装与使用
3.1下载hive源文件,解压hive文件
进入$hive_home/conf/修改文件
cp hive-default.xml.template hive-site.xml
cp hive-env.sh.template hive-env.sh
修改$hive_home/bin的hive-env.sh,增加以下三行
hadoop_home= --hadoop的home目录
export hive_conf_dir= --hive的conf目录
export hive_aux_jars_path= --hive的lib目录
生效文件:
source /hive-env.sh(生效文件)
3.2 配置mysql的metastore
修改$hive_home/conf/hive-site.xml
<property>
<name>javax.jdo.option.connectionurl</name>
<value>jdbc:mysql://localhost:3306/hive?createdatabaseifnotexist=true</value>
</property>
<name>javax.jdo.option.connectiondrivername</name>
<value>com.mysql.jdbc.driver</value>
<name>javax.jdo.option.connectionusername</name>
<value>root</value>
<name>javax.jdo.option.connectionpassword</name>
<value>123456</value>
3.3hive临时目录的配置
(1)设定数据目录
<name>hive.metastore.warehouse.dir</name>
<value>/usr/local/hive/warehouse</value>
(2)设定临时文件目录
<name>hive.exec.scratdir</name>
<value>/usr/local/hive/tmp</value>
(3)hive相关日志的目录
<name>hive.querylog.location</name>
<value>/usr/local/hive/log</value>
3.4hive的运行模式的指定
hive的运行模式即任务的执行环境,分为本地与集群两种,我们可以通过mapred.job.tracker 来指明
本地模式设置方式:
hive > set mapred.job.tracker=local;
hive > set hive.exec.mode.local.auto=true;
hive.exec.mode.local.auto.inputbytes.max默认128m
3.5 sqoop的安装
(1)下载、解压:
tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz /root
cd /root
ln -s sqoop-1.4.3.bin sqoop
(2)配置sqoop:
vi ~/.bash_profile
export sqoop_home=/usr/local/sqoop
export path=$sqoop_home/bin:$path
(3)测试连接数据库并列出数据库:
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456
(4)将mysql中的表导入到hive中:
sqoop import --connect jdbc:mysql://localhost:3306/gwifi --username root --password 123456 --table think_access --hive-import -m 1;
3.6 hive的命令行方式
1、输入#/hive/bin/hive执行应用程序, 或者
#hive
hive> create table test(id int, name string);
hive> show tables;
hive>quit;
查看并修改表与目录之间的关系
#hadoop fs -ls /user/hive/warehouse/
修改参数:hive.metastore.warehouse.dir 表与目录的对应关系
3.6 命令行方式
显示或修改参数值
在代码中可以使用${…}来使用
命名空间
使用权限
描述
hivevar
可读写
$ hive -d name=zhangsan;
hiveconf
$ hive –hiveconf hive.cli.print.current.db=true;$ hive –hiveconf hive.cli.print.header=true;
system
java定义的配置属性,如system:user.name
env
只读
shell环境变量,如env:user
3.7 hive的脚本运行
$>hive -i /home/my/hive-init.sql
$hive>source file
与linux交互命令 !
!ls
!pwd
与hdfs交互命令
dfs -ls /
dfs -mkdir /hive
3.8 hive的jdbc模式
java api交互执行方式
hive 远程服务 (端口号10000) 启动方式
3.9 hive常用的命令– set命令
hive控制台set命令:
set hive.cli.print.current.db=true;
set hive.metastore.warehouse.dir=/hive
hive参数初始化配置set命令:
~/.hiverc
四、hiveql数据操作
4.1数据类型
1、基本数据类型:与mysql等数据库中基本数据类型类似;
2、复合数据类型:
(1)array 数组类型 如:array[int] 下标访问
(2)struct结构类型 如: struct{name:string,age:int} .访问
(3)map结构
4.2 数据库/表的定义、操作
默认使用的是“default”数据库,使用命令选择数据库:
hive> use <数据库名>
创建数据库: create database <数据库名>
查看所有数据库: show databases;
查看/删除数据库:desc/drop database <数据库名>;
注:hive没有 行级别的插入,更新和删除操作,往表中插入数据的唯一方法就是使用成批载入操作
hive>create table 表名(字段名 字段类型,……)
hive>show tables;
hive>create table t2 like t1;
hive> drop table 表名 —删除表
增加列
hive>alter table t3 add columns(gender int);
在mysql中hive数据库中show tables; 在tbls表中可以查看到hie创建的表。
4.3 数据库/表的定义、操作
插入数据:insert overwrite table t_table1 select * from t_table1 where xxxx;
删除数据:insert overwrite table test select * from test where 1=0;
数组类型的表的操作:
定义复合数据类型的
表:create table demo_array(id int, mydata array[string]) partitioned by (dt string) row format delimited fields terminated by ’\t’ collection items terminated by ’|';
–id 与mydata之间是’\t’隔开,其后的mydata数据之间用’|'隔开
4.3.1 hive的数据模型-管理表
管理表,也称作内部表或受控表
特点:(1)数据全部保存在warehouse目录中;
(2)删除表时元数据和表中的数据都会被删除;
(3)创建表和数据加载可以在同一条语句中实现;
(4)每个表在hdfs中都有相应的目录用来存储表的数据
(5)加载数据的过程,实际数据会被移动到数据仓库目录中;对数据的访问是在数据仓库目录中完成。
创建数据文件inner_table.dat
创建表
hive>create table inner_table (key string)
row format delimited fields terminated by '\t';
//这个要指定,否则load的时候数据为null;
加载数据
hive>load data local inpath '/root/inner_table.dat' into table inner_table;
查看数据
select * from inner_table
select count(*) from inner_table
删除表 drop table inner_table
4.3.2 hive的数据模型-外部表
包含externable的表叫做外部表
特点:(1)删除外部表只删除metastore的元数据,不删除hdfs中的表数据;
(2)加载数据和创建表是同时完成的,并不会移动到数据,只是与外部数据建立一个链接;删除一个外部表,只是删除了该链接
(3)指向已经在 hdfs 中存在的数据
4.3.2 hive的数据模型-外部表语法
create external table page_view
( viewtime int,
userid bigint,
page_url string,
referrer_url string,
ip string comment 'ip address of the user',
country string comment 'country of origination‘
)
comment 'this is the staging page view table'
row format delimited fields terminated by '44' lines terminated by '12'
stored as textfile
location 'hdfs://centos:9000/user/data/staging/page_view';
4.3.3 hive的数据模型-分区表
分区可以理解为分类,通过分类把不同类型的数据放到不同的目录下;
分类的标准就是分区字段,可以一个,也可以多个;
分区表的意义在于优化查询,查询时尽量利用分区字段;如果不使用分区字段,就会全部扫描。
创建数据文件partition_table.dat
create table partition_table(rectime string,msisdn string)
partitioned by(daytime string,city string) row format delimited fields
terminated by '\t' stored as textfile;
加载数据到分区
load data local inpath '/home/partition_table.dat' into table partition_table partition (daytime='2013-02-01',city='bj');
select * from partition_table
select count(*) from partition_table
删除表 drop table partition_table
4.3.4 hive的数据模型-分区表
create table tmp_table #表名
(
title string, # 字段名称 字段类型
minimum_bid double,
quantity bigint,
have_invoice bigint
)comment '注释:xxx' #表注释
partitioned by(pt string) #分区表字段(如果你文件非常之大的话,采用分区表可以快过滤出按分区字段划分的数据)
row format delimited
fields terminated by '\001' # 字段是用什么分割开的
stored as sequencefile; #用哪种方式存储数据,sequencefile是hadoop自带的文件压缩格式
4.4.1 装载数据
从文件中装载数据
hive>load data [local] inpath '...' [overwrite] into table t2 [partition (province='beijing')];
通过查询表重新装载数据
hive>insert overwrite table t2 partition (province='beijing') select * from xxx where xx
设置job并行数量 hive.exec.parallel =true;
hive.exec.parallel. thread.number =3;
4.4.2 动态分区装载数据
开启动态分区支持
hive>set hive.exec.dynamic.partition=true;
hive>set hive.exec.dynamic.partition.mode=nostrict;
hive>set hive.exec.max.dynamic.partitions.pernode=1000;
#查询字段一样
hive>insert overwrite table t3 partition(province, city)
select t.province, t.city from temp t;
hive>insert overwrite table t3 partition(province='bj', city)
select t.province, t.city from temp t where t.province='bj';
单语句建表并同时装载数据
hive>create table t4 as select ....
select count(0) from (select id from test where name like 'zh%') a join
(select id from test where name like '%i%') b on a.id = b.id;
五、hive的存储形式比较
hive在建表时,可以通过‘stored as file_format’ 指定存储文件格式。有以下几种:
1.textfile:存储空间较大,压缩之后的文件不能分割与合并,查询效率低;可直接存储,加载速度最快;
2.sequencefile:hadoop api提供的一种二进制文件支持,存储空间最大,可分割与合并,查询效率高,需要text文件转换来加载
3.rcfile:是一种行列存储相结合的存储方式。(1)将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block;(2)块数据列式存储,有利于数据压缩和快速的列存取。查询效率最高、存储空间最小、但加载最慢
总结
作者:朱鹏飞
来源:51cto