@Lxjeng
2017-04-19T04:22:31.000000Z
字数 3099
阅读 739
- Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。
选用MySQL作为元数据库,将mySql和Hive安装在master服务器上
统一给放到/usr/local/hadoop
(1)使用MySQL数据库的安装方式
安装mysql
- sudo apt-get install mysql-server
启动mysql服务
- sudo service mysql start
登录mysql 以root用户身份登录
- mysql -uroot -ppassword
创建hive数据库,对其用户授权
(注意:mysql shell命令必须都以分号;结尾)
- insert into mysql.user(Host,User,Password)values("localhost","hive",password("hive"));
- create database hive;
- grant all on hive.* to hive@'%' identified by 'hive';
- grant all on hive.* to hive@'localhost' identified by 'hive';
- flush privileges;
验证hive是否创建成功
- show databases;
退出mysql
- exit
(2)安装Hive
下载hive并解压到/usr/local/hadoop
- sudo tar -zxvf apache-hive-1.2.2-bin.tar.gz /usr/local/hadoop
重命名(非必要)
- mv /usr/local/hadoop/apache-hive-1.2.2-bin/usr/local/hadoop/hive-1.2.2
配置环境变量
- sudo vim /etc/profile
导入以下配置并使其生效
export HIVE_HOME=/usr/local/hadoop/apache-hive-1.2.2-bin
export PATH=HIVE_HOME/bin
- source /etc/profile
修改hive-site.xml配置文件
(把Hive的元数据存储到MySQL中)

拷贝JDBC驱动包
将mysql的JDBC驱动包复制到Hive的lib目录下
- (默认hive使用Derby数据库存放元数据,并且也集成了Derby数据库及连接驱动jar包,但此处我们换成了MySQL作为数据库,所以还必须得有MySQL的JDBC驱动包。)
- cp mysql-connector-java.bin.jar /usr/local/hadoop/apache-hive-1.2.2-bin /lib
测试Hive
进入到Hive的安装目录,命令行:
- cd /usr/local/hadoop/apache-hive-1.2.1-bin/bin
- hive
hive>show tables;
- vim /usr/local/data.txt
- CREATE TABLE IF NOT EXISTS 表名(字段名 字段类型 COMMENT‘字段注释’,...);
- LOAD DATA LOCAL INPATH '/usr/local/data.txt' OVERWRITE INTO TABLE 表名;
- DROP TABLE 表名;
- show tables;
- ALTER TABLE 表名 ADD COLUMNS();
- ALTER TABLE oldName RENAME TO newName;
- CREATE TABLE copy_table LIKE table;
- SELECT * FROM 表名;
- SELECT 字段名 FROM 表名;
- select * from 表名 where 条件1 and 条件2;
默认是 all,表示查询所有记录,distinct 表示去掉重复的记录
- select all 字段列表 from 表名;
- select distinct 字段列表 from 表名;
在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念:
- 分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。
- 每个分区以文件夹的形式单独存在表文件夹的目录下。
- 分区建表分为2种,一种是单分区,在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
1)新建表时在后面添加PARTITIONED BY参数:
单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);
单分区表,按天分区,在表结构中存在id,content,dt三列。双分区建表语句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
2)在已创建表上添加分区,ALTER TABLE ADD PARTITION ()
3)数据加载进分区表中
- LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
4)查询指定分区的数据
- SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';
限制查询的记录数,查询的结果是随机选择的
- select * from table1 limit 5;
优化查询的速度,使用 hive.mapred.mode 属性,在strict模式下必须指定limit ,否则执行会报错
- set hive.mapred.mode=strict;
- select * from table order by uid limit 5;
使用 sort by 可以指定执行的 Reduce 个数(set mapred.reduce.tasks=< number>)这样可以输出更多的数据。对输出的数据再执行归并排序,即可以得到全部结果。
!! Hive 不支持用 insert 语句一条一条地进行插入操作,也不支持 update 操作。数据是以 load 的方式加载到建立好的表中。数据一旦导入就不可以修改。
创建一个表 insert_table,表结构和 table2 的结构相同,把 table2 表中的数据插入到新建的表 insert_table 中
- hive> create table insert_table like table2;----复制表结构
- hive> insert overwrite table insert_table select * from table2;
overwrite 关键字表示如果 insert_table 表中有数据就删除。