zl程序教程

您现在的位置是:首页 >  工具

当前栏目

hive 学习笔记(一)--- 入门

2023-09-11 14:22:11 时间

目录

数据仓库基本概念

主要特征

数据库与数据仓库的区别

            数仓的分层架构

Hive的基本概念

            Hive 架构

Hive 与 Hadoop 的关系

数据库、数据库表操作 

​ 内部表的操作

               外部表的操作

 内外部表的选择

              分区表的操作

 分桶表操作

                 修改表结构

hive表中加载数据


数据仓库基本概念

数据仓库是存数据的,企业的各种数据往里面存,主要目的是为了分析有效数据,后续会基 于它产出供分析挖掘的数据,或者数据应用需要的数据,如企业的分析性报告和各类报表 等。


主要特征

面向主题

数据仓库是面向主题的,数据仓库通过一个个主题域将多个业务系统的数据加载到一起,为了 各个主题(如:用户、订单、商品等)进行分析而建,操作型数据库是为了支撑各种业务而 建立。

集成性

数据仓库会将不同源数据库中的数据汇总到一起,数据仓库中的综合数据不能从原有的数据库 系统直接得到。因此在数据进入数据仓库之前,必然要经过统一与整合,这一步是数据仓库 建设中最关键、最复杂的一步(ETL),要统一源数据中所有矛盾之处,如字段的同名异义、异 名同义、单位不统一、字长不一致,等等。

非易失性

数据仓库的数据反映的是一段相当 长的时间内历史数据的内容,是不同时点的数据库的集合,以及基于这些快照进行统计、综 和重组的导出数据。数据仓库中的数据一般仅执行查询操作,很少会有删除和更新。但是 需定期加载和刷新数据。

时变性

虽然数据仓库的用户不能修改数据,但并不是说数据仓库的数据是永远不变 的。分析的结果只能反映过去的情况,当业务变化后,挖掘出的模式会失去时效性。因此数 据仓库的数据需要定时更新,以适应决策的需要。

数据库与数据仓库的区别

数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别

操作型处理,叫联机事务处理 OLTPOn-Line Transaction Processing,),也可以称面向交易 的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修 改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传 统的数据库系统作为数据管理的主要手段,主要用于操作型处理。 分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一般针对某些主题的历 史数据进行分析,支持 管理决策。

首先要明白,数据仓库的出现,并不是要取代数据库。

  • 数据库是面向事务的设计,数据仓库是面向主题设计的。
  • 数据库一般存储业务数据,数据仓库存储的一般是历史数据。
  • 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,
  • 记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计 是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
  • 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而 产生的,它决不是所谓的大型数据库


数仓的分层架构

数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库 后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

源数据层(ODS:此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开 放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

数据仓库层(DW:也称为细节层,DW层的数据应该是一致的、准确的、干净的数据, 即对源系统数据进行了清洗(去除了杂质)后的数据。

数据应用层(DAAPP:前端应用直接读取的数据源;根据报表、专题分析需求而计算

生成的数据。


Hive的基本概念

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并 提供类SQL查询功能。 其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储,说白了 hive可以理解为一个将SQL转换MapReduce的任务的工具,甚至更进一步可以说hive就是一 个MapReduce的客户端

Hive 架构

 

  • 用户接口: 包括CLIJDBC/ODBCWebGUI。其中,CLI(command line interface)shell命 令行;JDBC/ODBCHiveJAVA实现,与传统数据库JDBC类似
  • 元数据存储: 通常是存储在关系数据库如mysql/derby中。Hive 将元数据存储在数据库 中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表 等),表的数据所在目录等。
  • 解释器、编译器、优化器、执行器: 完成HQL 查询语句从词法分析、语法分析、编译、优 化以及查询计划的生成。生成的查询计划存储在HDFS 中,并在随后有MapReduce 调用执

Hive Hadoop 的关系

Hive利用HDFS存储数据,利用MapReduce查询分析数据

安装不做说明,只是想说作为刚入门的小白的我们,使用  hive 要先启动 hadoop 集群,MySQL,关闭防火墙,将 mysql-connector jar包上传到 hive安装目录的 lib 文件夹中等一系列基本的操作。


  数据准备

​// student 文件
01	赵雷	1990-01-01	男
02	钱电	1990-12-21	男
03	孙风	1990-05-20	男
04	李云	1990-08-06	男
05	周梅	1991-12-01	女
06	吴兰	1992-03-01	女
07	郑竹	1989-07-01	女
08	王菊	1990-01-20	女
 
// teacher 文件
01	张三
02	李四
03	王五
 
// course   老师id
01	语文	02
02	数学	01
03	英语	03
 
// s_id , c_id, s_score
01	01	80
01	02	90
01	03	99
02	01	70
02	02	60
02	03	80
03	01	80
03	02	80
03	03	80
04	01	50
04	02	30
04	03	20
05	01	76
05	02	87
06	01	31
06	03	34
07	02	89
07	03	98

数据库、数据库表操作 

   基本操作 跟 MySQL 语句 一样的,SQL 掌握了,这个学两天基本就入门了。

创建数据库

create database if not exists myhive;
use myhive;

创建数据库并指定位置  

create database myhive2 location '/myhive2';

删除数据库

drop database myhive2;

查看数据库更多详细信息  

desc database extended myhive2;

 查看表详细信息



 内部表的操作

创建表时,如果没有使用 external 关键字,则该表是内部表(managed table 。

// 创建表并指定表文件的存放路径
create  table if not exists stu2(id int ,name string) row format delimited 
fields terminated by '\t' location '/user/stu2';
// 根据查询结果创建表 复制表 数据也会复制
create table stu3 as select * from stu2;
// 根据已经存在的表结构创建表   仅仅是 复制的表结构 没有 复制到数据
create table stu4 like stu;

外部表的操作

创建 表时加 external,就创建了外部 表。  

操作案例

分别创建老师与学生表外部表,并向表中加载数据

// 创建老师表
create external table teacher (t_id string,t_name string) row format 
delimited fields terminated by '\t';
// 创建学生表
create external table student (s_id string,s_name string,s_birth string , 
s_sex string ) row format delimited fields terminated by '\t';
// 加载数据 到学生表
load data local inpath '/export/servers/hivedatas/student.csv' into table
student;
// 从  hdfs 上 加载 数据 techer.csv ,在hdfs中来说 是数据的移动   
load data inpath '/hivedatas/techer.csv' into table teacher;

接下来我们我们删除 外部表 teacher 

 

 而删除 内部表 表数据进了垃圾桶 

 外部表删除 ,当时数据文件还在,我们再次创建 teacher 表   加载 数据,可以 去 hdfs 中  

 内外部表的选择


分区表的操作

在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想 的,就是我们可以把大的数据,按照每月,或者天进行切分成一个个的小的文件,存放在不同 的文件夹中.

创建分区表语法  

create table score(s_id string,c_id string, s_score int) partitioned by
(month string) row format delimited fields terminated by '\t';

 创建一个表带多个分区

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';

加载数据到分区表中 

load data local inpath '/export/servers/hivedatas/score.csv' into table
score partition (month='20191025');

加载数据到多分区表中(多个子文件三个分区)

load data local inpath '/export/servers/hivedatas/score.csv' into table
score2 partition(year='2019',month='10',day='25');

 查询某一分区的数据

多分区表联合查询(使用 union all )

select * from score where month = '20191025' union all select * from score 
where month = '20191026';

查看分区

show partitions score;

添加一个分区

alter table score drop partition(month = '20191027');

删除分区

alter table score add partition(month='20191025');

分区表练习

需求描述

现在有一个文件score.csv文件,存放在集群的这个目录下/scoredatas/month=201910,这个文 件每天都会生成,存放到对应的日期文件夹下面去,文件别人也需要公用,不能移动。需 求,创建hive对应的表,并将数据加载到表中,进行数据统计分析,且删除表之后,数据不能 删除,  创建外部分区表 

创建外部分区表

创建外部分区表,并指定文件数据存放目录

create external table score4(s_id string, c_id string,s_score int) 
partitioned by (month string) row format delimited fields terminated by 
'\t' location '/scoredatas';

 

 


分桶表操作

分桶,就是将数据按照指定的字段进行划分到多个文件当中去,分桶就是MapReduce中的分区.

开启 Hive 的分桶功能

set hive.enforce.bucketing=true;

 设置 Reduce 个数

set mapreduce.job.reduces=3;

创建分桶表

create table course (c_id string,c_name string,t_id string) clustered 
by(c_id) into 3 buckets row format delimited fields terminated by '\t';

我们这里使用普通表 ,通过将数据加载到 普通表 中,再将通过 insert  overwrite 给桶表中加载数据创建普通表,并通过insert overwriter的方式将普通表的数据通过查询的方式加载到桶表当中 去,mapreduce脑壳疼。

 创建普通表加载数据

create table course_common (c_id string,c_name string,t_id string) row 
format delimited fields terminated by '\t';
load data local inpath '/export/servers/hivedatas/course.csv' into table
course_common;
// 通过insert overwrite给桶表中加载数据
insert overwrite table course select * from course_common cluster 
by(c_id);

执行结果

 


修改表结构

把表score4修改成score5

alter table score4 rename to score5;
// 查询表结构
desc score5;
// 添加列
alter table score5 add columns (mycol string, mysco int);
// 更新列
alter table score5 change column mysco mysconew int;

hive表中加载数据

直接 向分区 insert into 入门 练手

insert into table score partition(month ='20191028') values
('001','002','100');

通过load方式加载数据

load data local inpath '/export/servers/hivedatas/score.csv' overwrite 
into table score3 partition(month='201910');

通过查询方式加载数据,   复制 score 的表结构,再将 分区 20191027(文件夹) 的数据 加载到 表score5(文件夹)

create table score5 like score;
insert overwrite table score4 partition(month = '20191025') select
s_id,c_id,s_score from score;