Hadoop生态系统之Hive

本文将从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语句执行顺序:

  1. from
  2. where
  3. group by
  4. select
  5. having
  6. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值