20200603大数据hive学习笔记

Hive


1.1 基本概念

英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化
数据环境,为企业提供决策支持(Decision Support)。
数据仓库是存数据的,企业的各种数据往里面存,主要目的是为了分析有效数据,后续会基 于它产出供分析挖掘的数据,或者数据应用需要的数据,如企业的分析性报告和各类报表 等。
可以理解为: 面向分析的存储系统 。


1.2. 主要特征
数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、非易失的(Non- Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策。
1.2.1. 面向主题
数据仓库是面向主题的,数据仓库通过一个个主题域将多个业务系统的数据加载到一起,为了 各个主题(如:用户、订单、商品等)进行分析而建,操作型数据库是为了支撑各种业务而 建立。
1.2.2. 集成性
数据仓库会将不同源数据库中的数据汇总到一起,数据仓库中的综合数据不能从原有的数据库 系统直接得到。因此在数据进入数据仓库之前,必然要经过统一与整合,这一步是数据仓库 建设中最关键、最复杂的一步(ETL),要统一源数据中所有矛盾之处,如字段的同名异义、异 名同义、单位不统一、字长不一致,等等。

1.2.3. 非易失性

操作型数据库主要服务于日常的业务操作,使得数据库需要不断地对数据实时更新,以便迅 速获得当前最新数据,不至于影响正常的业务运作。
在数据仓库中只要保存过去的业务数据,不需要每一笔业务都实时更新数据仓库,而是根据 商业需要每隔一段时间把一批较新的数据导入数据仓库。 数据仓库的数据反映的是一段相当 长的时间内历史数据的内容,是不同时点的数据库的集合,以及基于这些快照进行统计、综 合和重组的导出数据。数据仓库中的数据一般仅执行查询操作,很少会有删除和更新。但是 需定期加载和刷新数据。

1.2.4. 时变性
数据仓库包含各种粒度的历史数据。数据仓库中的数据可能与某个特定日期、星期、月份、 季度或者年份有关。数据仓库的目的是通过分析企业过去一段时间业务的经营状况,挖掘其 中隐藏的模式。虽然数据仓库的用户不能修改数据,但并不是说数据仓库的数据是永远不变 的。分析的结果只能反映过去的情况,当业务变化后,挖掘出的模式会失去时效性。因此数 据仓库的数据需要定时更新,以适应决策的需要。


1.3. 数据库与数据仓库的区别 数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别。
操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing,),也可以称面向交易 的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修 改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传 统的数据库系统作为数据管理的主要手段,主要用于操作型处理。
分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一般针对某些主题的历 史数据进行分析,支持 管理决策。
首先要明白,数据仓库的出现,并不是要取代数据库。
数据库是面向事务的设计,数据仓库是面向主题设计的。 数据库一般存储业务数据,数据仓库存储的一般是历史数据。 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表, 记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计 是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。


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

1.4. 数仓的分层架构 按照数据流入流出的过程,数据仓库架构可分为三层——源数据、数据仓库、数据应用。

数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库 后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。
源数据层(ODS) :此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开 放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
数据仓库层(DW) :也称为细节层,DW层的数据应该是一致的、准确的、干净的数据, 即对源系统数据进行了清洗(去除了杂质)后的数据。
数据应用层(DA或APP) :前端应用直接读取的数据源;根据报表、专题分析需求而计算 生成的数据。
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取 Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的 血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精 力就是保持ETL的正常和稳定。

为什么要对数据仓库分层?

用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存 在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清 洗过程,工作量巨大。
通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完 成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每 一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数 据发生错误的时候,往往我们只需要局部调整某个步骤即可。

1.5. 数仓的元数据管理
元数据(Meta Date),主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓 库的数据状态及ETL的任务运行状态。一般会通过元数据资料库(Metadata Repository)来统 一地存储和管理元数据,其主要目的是使数据仓库的设计、部署、操作和管理能达成协同和 一致。
元数据是数据仓库管理系统的重要组成部分,元数据管理是企业级数据仓库中的关键组件, 贯穿数据仓库构建的整个过程,直接影响着数据仓库的构建、使用和维护。
构建数据仓库的主要步骤之一是ETL。这时元数据将发挥重要的作用,它定义了源数据系 统到数据仓库的映射、数据转换的规则、数据仓库的逻辑结构、数据更新的规则、数据 导入历史记录以及装载周期等相关内容。数据抽取和转换的专家以及数据仓库管理员正 是通过元数据高效地构建数据仓库。 用户在使用数据仓库时,通过元数据访问数据,明确数据项的含义以及定制报表。 数据仓库的规模及其复杂性离不开正确的元数据管理,包括增加或移除外部数据源,改 变数据清洗方法,控制出错的查询以及安排备份等。


元数据可分为技术元数据和业务元数据。技术元数据为开发和管理数据仓库的IT 人员使用, 它描述了与数据仓库开发、管理和维护相关的数据,包括数据源信息、数据转换描述、数据 仓库模型、数据清洗与更新规则、数据映射和访问权限等。而业务元数据为管理层和业务分 析人员服务,从业务角度描述数据,包括商务术语、数据仓库中有什么数据、数据的位置和 数据的可用性等,帮助业务人员更好地理解数据仓库中哪些数据是可用的以及如何使用。
由上可见,元数据不仅定义了数据仓库中数据的模式、来源、抽取和转换规则等,而且是整 个数据仓库系统运行的基础,元数据把数据仓库系统中各个松散的组件联系起来,组成了一 个有机的整体。


2. Hive 的基本概念

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

为什么使用Hive
采用类SQL语法去操作数据,提供快速开发的能力。 
避免了去写MapReduce,减少开发人员的学习成本。 
功能扩展很方便。


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


2.3. Hive 与 Hadoop 的关系 
Hive利用HDFS存储数据,利用MapReduce查询分析数据

2.4. Hive与传统数据库对比 hive用于海量数据的离线数据分析


su - mysqladmin

mysql -uroot -p123456

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

启动错误报了个错,
Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /tmp/hive/hadoop/77f0fb7f-6e1c-4287-8b7a-b0a47d75cee1. Name node is in safe mode.
The reported blocks 12 has reached the threshold 0.9990 of total blocks 12. The number of live datanodes 1 has reached the minimum number 0. In safe mode extension. Safe mode will be turned off automatically in 0 seconds.

解决方案:关闭safenode
hadoop dfsadmin -safemode leave
或者
hdfs dfsadmin -safemode leave

之前mysql安装在mysqladmin那里,然后天坑==
然后重新装了下
照着这个步骤来,我是在阿里云,其他云应该也差不多,真的天坑,查了好多资料,删了又装,装了又删的==
https://yq.aliyun.com/articles/285398

 1 create [external] table [if not exists] table_name (
2 col_name data_type [comment '字段描述信息']
3 col_name data_type [comment '字段描述信息'])
4 [comment '表的描述信息']
5 [partitioned by (col_name data_type,...)]
6 [clustered by (col_name,col_name,...)]
7 [sorted by (col_name [asc|desc],...) into num_buckets buckets]
8 [row format row_format]
9 [storted as ....]
10 [location '指定表的路径']


罗列些重点的,修create table这些就不讲了

external
可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径 (LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;
若创建外部 表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的 元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。


comment
表示注释,默认不能使用中文

partitioned by
表示使用表分区,一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下 .

clustered by 对于每一个表分文件, Hive可以进一步组织成桶,也就是说桶是更为细粒
度的数据范围划分。Hive也是 针对某一列进行桶的组织。

sorted by
指定排序字段和排序规则

row format
指定表文件字段分隔符

storted as 指定表文件的存储格式, 常用格式:SEQUENCEFILE, TEXTFILE, RCFILE,如果文件 数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 storted as SEQUENCEFILE。

location
指定表文件的存储路径


3.2.2内部表的操作 创建表时,如果没有使用external关键字,则该表是内部表(managed table)


create database myhive;

use myhive;
create table stu(id int,name string);
insert into stu values (1,"zhangsan");  #插入数据
select * from stu;

create  table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t';

create table stu3 as select * from stu2; # 通过复制表结构和表内容创建新表


create table stu4 like stu;

desc formatted  stu2;

####3.2.3外部表的操作

[外部表说明]()

外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉.

[内部表和外部表的使用场景]()

每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

[操作案例]()

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

```sql
create external table teacher (t_id string,t_name string) row format delimited fields terminated by '\t';
```

[创建学生表]()

```sql
create external table student (s_id string,s_name string,s_birth string , s_sex string ) row format delimited fields terminated by '\t';
```


Note:要放一个mysql的jar包到hive的lib里,版本兼容很受影响,要看仔细教程


load data local inpath '/home/hadoop/data/student.csv' into table student;

load data local inpath '/home/hadoop/data/teacher.csv' into table teacher;

在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了,同样的道理,在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 '/home/hadoop/data/score.csv' into table score partition (month='202006');

show  partitions  score;


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


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

load data local inpath '/home/hadoop/data/score.csv' into table score partition (month='202006');

load data local inpath '/home/hadoop/data/score.csv' into table score2 partition(year='2020',month='06',day='01');


[多分区表联合查询(使用 `union all`)]( /data/20180101/1.log)

```sql
select * from score where month = '202006' union all select * from score where month = '202006';


hadoop fs -mkdir -p /scoredatas/month=202006
hadoop fs -put score.csv /scoredatas/month=202006

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

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

 

今天搞报错搞了挺久==版本问题慎重。深坑

你可能感兴趣的:(大数据之路)