本文将从Hive的大方向上及Hive细节使用这两个方向来阐述:
1、Hive是什么?hive在Hadoop生态系统中充当什么角色?为什么需要学习使用Hive
2、如何使用Hive及代码演示
一 宏观剖析
1 Hive是个啥?
摘自百度百科
hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据:可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能;可以将SQL语句转换为MapReduce任务运行,通过自己的SQL查询分析需要的内容,这套SQL简称Hive SQL,使不熟悉mapreduce的用户可以很方便地利用SQL语言‘查询、汇总和分析数据。而mapreduce开发人员可以把自己写的mapper和reducer作为插件来支持hive做更复杂的数据分析。它与关系型数据库的SQL略有不同,但支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。它还提供了一系列的进行数据提取转化加载,用来存储、查询和分析存储在Hadoop中的大规模数据集,并支持UDF(User-Defined Function)、UDAF(User-Defnes AggregateFunction)和USTF(User-Defined Table-Generating Function),也可以实现对map和reduce函数的定制,为数据操作提供了良好的伸缩性和可扩展性。
2 为啥要学习hive?
笔者个人认为:hive就是基于hadoop的一个数据仓库工具,可以对仓库进行数据提取,转换等一些列操作,其实我们写一个mapreduce程序同样也可以完成此类操作,但是为什么要学习hive和使用hive呢?因为它简单啊~
回想一下我们写一条SQL语句才多少代码量,一个MR程序多少代码量,而且通过hive可以使MR变得更加简单,所以hive是十分适合对数据仓库进行统计的一门工具,但是hive不提供实时查询功能和基于行级的数据更新操作,它更适合应用在基于大量不可变的批处理作业中如网络日志分析等,如果你使用hive去查询一个几百M的数据集那可能需要几分钟的时间延迟。
所以到这里,我想大部分人应该都明白hive是啥了吧,其实写hive就相当于在写MR程序,只不过更简单了,因为hive它能帮你把写的hql语句翻译成MR能看懂的语句来执行MR程序,达到殊途同归的效果。
二 基本使用
这里笔者就直接将平时写的笔记CV上来啦,若有不到之处还请指正。~
1 Hive入门
-- “-e”不进入hive的交互窗口执行sql语句
bin/hive -e "sql";
-- “-f”执行脚本中sql语句
bin/hive -f /opt/module/datas/hive.sql
-- 在hive cli命令窗口中访问hdfs
dfs -ls /;
-- 在hive cli命令窗口执行shell命令
! ls /opt/module/datas;
-- 在hive cli命令窗口查看当前所有的配置信息
set;
-- 命令行添加参数
hiveconf param=value;
bin/hive -hiveconf mapred.reduce.tasks=10;
-- 查看参数设置
set mapred.reduce.tasks;
-- 在HQL中使用声明参数
hive (default)> set mapred.reduce.tasks=100;
-- 查看参数设置
hive (default)> set mapred.reduce.tasks;
注:命令行和HQL中设置仅对本次hive启动有效
-- 设置MR以Local模式运行
set hive.exec.mode.local.auto=true;
连接方式:使用Beeline连接Hive
默认hiveserver2是前台运行,设置后台运行
hiveserver2 &
启动beeline后,创建连接
beeline
!connect 'jdbc:hive2://hadoop102:10000'
连接方式:使用Java程序连接Hive
<!-- Maven依赖,导入hive-jdbc驱动 -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
注:hive还依赖于hadoop,还需要将hadoop依赖也加入
//1 注册驱动 可选,只要导入hive-jdbc.jar,会自动注册驱动
//Class.forName("org.apache.hive.jdbc.HiveDriver");
//2 创建连接 url,driverClass,username,password
Connection connection = DriverManager.getConnection("jdbc:hive2://$userhost:10000", "$user", " ");
//3 准备sql
String sql="select * from table_name";
//4 执行查询
PreparedStatement ps = connection.prepareStatement(sql);
//5 遍历结果集
while (resultSet.next()){
System.out.println("column_name:" + resultSet.getString("column_name")+" column_name:" + resultSet.getInt("column_name"));
}
//6 关闭资源
resultSet.close();
ps.close();
connection.close();
Hql语句执行顺序:
- from
- where
- group by
- select
- having
- order by
2 DDL(数据定义语言)
2.1 DDL之库操作
创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
-- 示例:
CREATE DATABASE IF NOT EXISTS db_hive2
COMMENT 'myDB'
LOCATION '/'
删除数据库
DROP DATABASE [IF EXISTS] database_name [CASCADE];
注:删除库时,是两步操作
1.在mysql的DBS表中删除库的元数据
2.删除hdfs上库存放的路径
3.库中有表需要加上CASCADE
修改数据库
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...);
-- (Note: SCHEMA added in Hive 0.14.0)
注:修改DBPROPERTIES属性,同名的属性会覆盖,不存在的属性会新增
ALTER DATABASE database_name SET OWNER [USER|ROLE] user_or_role;
-- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
注:更改库的所有者
ALTER DATABASE database_name SET LOCATION hdfs_path;
-- (Note: Hive 2.2.1, 2.4.0 and later)
注:更改location路径
查询库结构
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...);
-- (Note: SCHEMA added in Hive 0.14.0)
注:修改DBPROPERTIES属性,同名的属性会覆盖,不存在的属性会新增
ALTER DATABASE database_name SET OWNER [USER|ROLE] user_or_role;
-- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
注:更改库的所有者
ALTER DATABASE database_name SET LOCATION hdfs_path;
-- (Note: Hive 2.2.1, 2.4.0 and later)
注:更改location路径
2 DDL之表操作
创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
-- 列的信息
(col_name data_type [COMMENT col_comment], ...)
-- 表的注释
[COMMENT table_comment]
-- 是否是分区表,及指定分区字段,分区字段不能和列的字段相同
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
-- 指定表中的数据在分桶时以什么字段进行分桶操作
[CLUSTERED BY (col_name, col_name, ...)
-- 表中的数据在分桶时,以什么字段作为排序的字段
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
-- 表中数据每行的格式,指定分隔符等
[ROW FORMAT row_format]
-- 如果向表中插入数据时,数据以什么格式存储
[STORED AS file_format]
-- 表在hdfs上存储的位置
[LOCATION hdfs_path]
-- 指定表的某些属性
[TBLPROPERTIES]
-- 列分隔符
[row format delimited fields terminated by ',']
-- 数组分隔符
[collection items terminated by '_']
-- map分隔符
[map keys terminated by ':';]
-- 行分隔符
[lines terminated by '\n'];
-- 根据查询结果创建表
CREATE TABLE [IF NOT EXITS] table_name AS SELECT col_name, col_name FROM table_name;
-- 根据已经存在的表结构创建表
CREATE TABLE [IF NOT EXITS] table_name LIKE table_name;
删除表
-- 删除表
DROP TABLE [IF EXISTS] table_name;
-- 清空表数据(表必须是管理表)
TRUNC