本文主要围绕hive的基础知识点进行讲解。主要包括以下几个方面:
提示:以下是本篇文章正文内容,下面案例可供参考
数据仓库的英文名称为Data Warehouse,可简写为DW或DWH。
数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持的目的而创建。
数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。
首先要明白,数据仓库的出现,并不是要取代数据库。
数据库是面向事务的设计,数据仓库是面向主题设计的。
数据库一般存储业务数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计;比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析;数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。
显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。
数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。
按照数据流入流出的过程,数据仓库架构可分为三层——源数据层、数据仓库层、数据应用层。
数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。
源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。
为什么要对数据仓库分层?
用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。
Hive是基于Hadoop的一个数据仓库工具
Hive 具有 SQL 数据库的外表,但应用场景完全不同。
Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。
优点
操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
避免了去写MapReduce,减少开发人员的学习成本。
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点
Hive 的查询延迟很严重
hadoop jar xxxx.jar xxx.class /input /output
进行任务的划分,然后进行计算资源的申请
map 0% reduce 0%
map 10% reduce 0%
Hive 不支持事务
1、用户接口:Client
2、元数据:Metastore
3、Hadoop集群
使用HDFS进行存储,使用MapReduce进行计算。
4、Driver:驱动器
Hive的交互方式主要有三种
使用Hive之前:
先启动hadoop集群:因为hql语句会被编译成MR任务提交到集群运行;hive表数据一般存储在HDFS上
mysql服务:因为对hive操作过程中,需要访问mysql中存储元数据的库及表
hive
启动hiveserver2服务,前台启动与后台启动方式二选一
前台启动
[hadoop@node03 ~]$ hive --service hiveserver2
[hadoop@node03 ~]$ nohup hive --service hiveserver2 &
[hadoop@node03 ~]$ beeline
beeline> !connect jdbc:hive2://node03:10000
用户名hadoop,密码为空即可
0: jdbc:hive2://node03:10000> !quit
[hadoop@node03 ~]$ hive -e "show databases"
[hadoop@node03 ~]$ cd /kkb/install/
[hadoop@node03 install]$ vim hive.sql
文件内容如下
create database if not exists myhive;
通过以下命令来执行我们的hive脚本
[hadoop@node03 install]$ hive -f /kkb/install/hive.sql
类型名称 | 描述 | 举例 |
---|---|---|
boolean | true/false | true |
tinyint | 1字节的有符号整数 | 1 |
smallint | 2字节的有符号整数 | 1 |
int | 4字节的有符号整数 | 1 |
bigint | 8字节的有符号整数 | 1 |
float | 4字节单精度浮点数 | 1.0 |
double | 8字节单精度浮点数 | 1.0 |
string | 字符串(不设长度) | “abc” |
varchar | 字符串(1-65355长度,超长截断) | “abc” |
timestamp | 时间戳 | 1563157873 |
date | 日期 | 20190715 |
类型名称 | 描述 | 举例 |
---|---|---|
array | 一组有序的字段,字段类型必须相同 array(元素1,元素2) | Array(1,2,3) |
map | 一组无序的键值对 map(k1,v1,k2,v2) | Map(‘a’,1,‘b’,2) |
struct | 一组命名的字段,字段类型可以不同 struct(元素1,元素2) | Struct(‘a’,1,2,0) |
array类型的字段的元素访问方式
map类型字段的元素访问方式
struct类型字段的元素获取方式
示例:创建一张表,包含了array、map、struct类型的字段
create table complex(
col1 array<int>,
col2 map<string,int>,
col3 struct<a:string,b:int,c:double>
)
hive > create database db_hive;
# 或者
hive > create database if not exists db_hive;
hive> show databases;
hive> show databases like 'db_hive*';
hive> desc database db_hive;
hive> desc database extended db_hive;
hive > use db_hive;
#删除为空的数据库
hive> drop database db_hive;
#如果删除的数据库不存在,最好采用if exists 判断数据库是否存在
hive> drop database if exists db_hive;
#如果数据库中有表存在,这里需要使用cascade强制删除数据库
hive> drop database if exists db_hive cascade;
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] row format delimited fields terminated by “分隔符”
[STORED AS file_format]
[LOCATION hdfs_path]
官网地址:<https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL>
字段解释说明
- CREATE TABLE 创建一个指定名字的表
- EXTERNAL 创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),指定表的数据保存在哪里
- COMMENT 为表和列添加注释
- PARTITIONED BY 创建分区表
- CLUSTERED BY 创建分桶表
- SORTED BY 按照字段排序(一般不常用)
- ROW FORMAT 指定每一行中字段的分隔符
- row format delimited fields terminated by ‘\t’
- STORED AS 指定存储文件类型
- 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、ORCFILE(列式存储格式文件)
- 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE
- LOCATION 指定表在HDFS上的存储位置。
use myhive;
create table stu(id int, name string);
可以通过insert into向hive表当中插入数据,但是不建议工作当中这么做;因为每个insert语句转换成mr后会生成一个文件
insert into stu(id,name) values(1,"zhangsan");
insert into stu(id,name) values(2,"lisi");
select * from stu;
create table if not exists myhive.stu1 as select id, name from stu;
表中有数据
select * from stu1;
3、like建表法
create table if not exists myhive.stu2 like stu;
表中没有数据
select * from stu2;
4、查询表的类型
hive > desc formatted myhive.stu;
create table if not exists myhive.stu3(id int, name string)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/stu3';
create external table myhive.teacher (t_id string, t_name string)
row format delimited fields terminated by '\t';
创建外部表的时候需要加上**external** 关键字
location字段可以指定,也可以不指定
向外部表当中加载数据:
load数据可以从本地文件系统加载或者也可以从hdfs上面的数据进行加载
从本地文件系统加载数据到teacher表当中去,将我们附件当汇总的数据资料都上传到node03服务器的/kkb/install/hivedatas路径下面去,这里准备好了数据可以直接下载: https://pan.baidu.com/s/1og65BbfprZhXphob3Hl7ig 密码: 6kp4
mkdir -p /kkb/install/hivedatas
将数据都上传到/kkb/install/hivedatas路径下
然后在hive客户端下执行以下操作
load data local inpath '/kkb/install/hivedatas/teacher.csv' into table myhive.teacher;
cd /kkb/install/hivedatas
hdfs dfs -mkdir -p /kkb/hdfsload/hivedatas
hdfs dfs -put teacher.csv /kkb/hdfsload/hivedatas
# 在hive的客户端当中执行
load data inpath '/kkb/hdfsload/hivedatas' overwrite into table myhive.teacher;
#将stu内部表改为外部表
alter table stu set tblproperties('EXTERNAL'='TRUE');
#把teacher外部表改为内部表
alter table teacher set tblproperties('EXTERNAL'='FALSE');
1、建表语法的区别
2、删除表之后的区别
内部表由于删除表的时候会同步删除HDFS的数据文件,所以确定如果一个表仅仅是你独占使用,其他人不使用的时候就可以创建内部表,如果一个表的文件数据,其他人也要使用,那么就创建外部表
一般外部表都是用在数据仓库的ODS层
内部表都是用在数据仓库的DW层
- 在文件系统上建立文件夹,把表的数据放在不同文件夹下面,加快查询速度。
hive (myhive)> create table score(s_id string, c_id string, s_score int) partitioned by (month string) row format delimited fields terminated by '\t';
hive (myhive)> create table score2 (s_id string,c_id string, s_score int) partitioned by (year string, month string, day string) row format delimited fields terminated by '\t';
hive (myhive)>load data local inpath '/kkb/install/hivedatas/score.csv' into table score partition (month='201806');
hive (myhive)> load data local inpath '/kkb/install/hivedatas/score.csv' into table score2 partition(year='2018', month='06', day='01');
hive (myhive)> show partitions score;
hive (myhive)> alter table score add partition(month='201805');
hive (myhive)> alter table score add partition(month='201804') partition(month = '201803');
注意:添加分区之后就可以在hdfs文件系统当中看到表下面多了一个文件夹
删除分区
hive (myhive)> alter table score drop partition(month = '201806');
外部分区表综合练习:
需求描述:
需求实现:
数据准备:
node03执行以下命令,将数据上传到hdfs上面去
将我们的score.csv上传到node03服务器的/kkb/install/hivedatas目录下,然后将score.csv文件上传到HDFS的/scoredatas/day=20180607目录上
cd /kkb/install/hivedatas/
hdfs dfs -mkdir -p /scoredatas/day=20180607
hdfs dfs -put score.csv /scoredatas/day=20180607/
hive (myhive)> create external table score4(s_id string, c_id string, s_score int) partitioned by (day string) row format delimited fields terminated by '\t' location '/scoredatas';
hive (myhive)> msck repair table score4;
本文主要描述了数据仓库和数据库的区别,介绍了什么是Hive,以及Hive的各种DDL语法、内部表和外部表的区别,大家可以根据之前的文章,把hive搭建起来,尝试一下,下篇文章会继续深入了解Hive,之后也会有SQL必练50题的HQL版本,供大家练手。