【1】什么是Hive
•Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
•本质是将SQL转换为MapReduce程序
【2】为什么要使用Hive
•操作接口采用类SQL语法,提供快速开发的能力
•避免了去写MapReduce,减少开发人员的学习成本
•扩展功能很方便
【3】Hive的特点
•可扩展
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务
•延展性
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
•容错
良好的容错性,节点出现问题SQL仍可完成执行
Hive不需要像zookeeper和Hbase那样集群安装,Hive单节点安装即可。
【1】准备
1 > hive的运行要依赖hadoop的dfs,所以先要打开hadoop集群和zookeeper集群
2 > tar包
3 > mysql链接驱动(jar)
【2】安装
1. 解压
tar -xzvf hive-0.9.0.tar.gz
cp -r hive-0.9.0 /usr/local
2.修改配置文件
mv hive-default.xml.template hive-site.xml
修改hive-site.xml(删除所有内容,只留一个<property></property>)
添加如下内容:
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop2005:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
<description>password to use against metastore database</description>
</property>
这里主要配置所要链接的mysql信息,mysql跟hive最好别再同一台机器上安装
3. 将mysql驱动放入hive/lib/下
cp mysql-connector-5.1.8.jar /usr/local/hive-0.96/lib/
4.mysql授权
去安装mysql的机器上运行
mysql -uroot -p
#(执行下面的语句 *.*:所有库下的所有表 %:任何IP地址或主机都可以连接)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
5.启动hive
cd /usr/local/hive-0.96/bin
./hive
6.简单操作
show databases;
show tables;
create database testDB;
use testDB;
create table test_db01 (id int , name string);
#注意列和列的分隔符设置(如果要加载本地数据,列分隔符要与本地文件分隔符一致)
create table stu (id int , name string) row format delimited fields terminated by '\t'
show create table test_db01;
//加载本地文件到hive表test_db01(你所加载的文件要与表的结果对应,列数对应,分隔符对应)
load data local inpath '/root/Desktop/stu.txt' into table test_db01;
//加载HDFS数据到hive表(你所加载的文件要与表的结果对应,列数对应,分隔符对应)
load data inpath'/HDFS文件路径' into table 表名
select * from test_db01;
select count(*) from test_db01;
select * from test_db01 order by id desc;
7.查看验证
hdfs:hdfs下存储的是真正要计算的数据(真正的数据)
默认在hdfs 的/user/hive/warehouse
mysql:存储的hdfs的目录关系映射
8.建表(默认是内部表 MANAGED_TABLE,默认内部表所在的HDFS的目录为/user/hive/warehouse下)
create table trade_detail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t';
建分区表(提高查询效率,将数据按照某种规则分类)
create table td_part(id bigint, account string, income double, expenses double, time string) partitioned by (logdate string) row format delimited fields terminated by '\t';
#注意:这里建分区表的分区字段可以依据建表所存在的列也可以不存在的列,如果依据的列不存在,则会主动添加此列(所以此表实际所拥有的列为id account income expenses time logdate)
建外部表(EXTERNAL_TABLE,先有数据后有表,即先有HDFS数据,建一张hive表指向HDFS目录)
create external table td_ext(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by '\t' location '/td_ext';
#注意:当你创建的外部表所指向的目录在HDFS上不存在时,hive会自动创建
# 内部表与外部表的区别在于内部表是先有表后有数据,外部表则是先有数据后有表,
内部表的默认HDFS目录为/user/hive/warehouse,外部表则可以随意指定HDFS的目录
另外,无论是内部表还是外部表,只要文件放入对应的hdfs目录中就可以通过hive语句查到(因为有meatstore记录的表映射)
9.创建分区表
普通表和分区表区别:有大量数据增加的需要建分区表(可以把数据按照某种规则进行分区分类)
create table book (id bigint, name string) partitioned by (pubdate string) row format delimited fields terminated by '\t';
分区表加载数据(如果是给分区表加载数据,一定要指定到具体分区)
load data local inpath './book.txt' overwrite into table book partition (pubdate='2010-08-22');
load data local inpath '/root/data.am' into table beauty partition (nation="USA");
#在加载数据时,load data local inpath 表示在本地加载,load data inpath表示在HDFS加载
select nation, avg(size) from beauties group by nation order by avg(size);
【hive状态下操作hadoop】
hive状态下也可以操作hadoop,其命令格式大致与hadoop操作一致,只是将hadoop改为dfs,另外在结束时加“;”号即可
#hadoop操作
hadoop fs -ls /
hadoop fs -mkdir /hive-hadoop
#hive操作
dfs -ls /;
dfs -mkdir /hive-hadoop;
向分区表中加载数据
创建外部表