数据仓库-Hive

1、数据仓库

1.1、数据仓库基本概念

      数据仓库的英文名称为:Data Warehouse,简写为DW或者DWH。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持。总的来说,数据仓库就是一种面相分析的存储系统。

1.2、数据仓库主要特征

      数据仓库是面向主题的,集成的,非易失的,时变的数据集合,用以支持管理决策。

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)联机分析处理,一般是针对某一个主题历史数据进行分析,支持管理决策。

  1. 数据库是面向事务的设计,数据仓库是面向主题设计的。
  2. 数据库一般存储业务数据,数据仓库存储的一般是历史数据
  3. 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
  4. 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
          数据仓库是在数据库已经大量存在的情况下,为了进一步挖掘数据资源,为了决策需要而产生的,它绝不是所谓的“大型数据库”。

1.4、数据仓库的分层架构

根据数据流入流出的过程,数据仓库架构分为三层:元数据,数据仓库,数据应用
数据仓里分层架构

数据仓库分层原因:

      通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

1.5、数据仓库的元数据管理

      元数据:元数据可以理解为一种记录数据的数据,记录数据仓库中模型的定义、各级层之间的映射关系、监控数据仓库的数据状态及ETL的任务运行状态。一般会通过元数据资料库来统一地存储和管理元数据。
      也就是说数据仓库是通过元数据将各个组件联系在一起,组成一个整体。数据仓库是虚拟的,元数据记录描述了所有数据并保存在元数据资料库中(一般是在MySQL)。
元数据记录信息

2、Hive基本概念

2.1、Hive简介

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。Hive

2.2、Hive架构

Hive架构图

  • 用户接口:包括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的交互方式

第一种交互方式 :bin/hive

直接进入Hive的客户端。

第二种交互方式:使用SQL语句或者SQL脚本进行交互

不进入Hive的客户端,直接执行hive的HQL语句:

cd /export/servers/apache-hive-2.1.1-bin
bin/hive -e "create database if not exists mytest;"

使用SQL脚本:

vim hive.sql

create database if not exists mytest;
use mytest;
create table stu(id int,name string);

执行:
bin/hive -f /export/servers/hive.sql

3、Hive的基本操作

3.1、数据库操作

3.1.1、创建数据库
create database if not exists myhive;
use myhive;
3.1.2、删除数据库
drop database myhive2;
如果所要删除的数据库存在数据表,会报错。
下面是强制删除数据库,包括数据下面的表一起删除:
drop database myhive cascade;

3.2、数据库表操作

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

说明:

  1. 内部表和外部表
  2. external:在Hive中创建表时,无external修饰的是内部表(managed table),有external修饰的是外部表(external table)。在创建一个外部表的时候需要指向一个实际数据的路径,使用LOCATION关键字来定义;也就是说创建一个内部表会将数据移动到数据仓库指向的路径;创建一个外部表仅仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
  3. partitioned by:表示分区,一个表可以拥有一个或者多个分区,每个分区单独存在一个目录下。
  4. clustered by 对于每一个表分文件, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。
3.2.2、内部表操作
Hive建表字段类型

原始类型:
集合类型:

  1. Array:有序的同类型的集合;
  2. Map:Key-Value,Key必须是原始类型,value可以是任意类型。
  3. struct:字段集合,类型可以不同;
  4. union在有限取值范围内的一个值。
3.2.3、外部表操作

**概述:**外部表因为是指定其他的HDFS路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据依旧存放在HDFS中,不会删除。

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

3.2.4、分区表操作

分区表指的就是将一个大的文件切割成一个小小的文件,这样吗每次操作一个小文件就会显得很简单。
用法:在创建表的时候通过关键字partitioned by指定分区字段,然后在导入数据的时候指定分区,如:partition (month=‘201806’);

3.2.5、分桶表操作

分桶,就是将数据按照指定的字段进行划分到多个文件当中去,就类似于MapReduce中的分区。
桶表的数据加载:

//1、创建普通表
create table course_common 
	(c_id string,c_name string,t_id string) 
	row format delimited 
	fields terminated by '\t';

// 2、普通表中加载数据
load data local 
	inpath '/export/servers/hivedatas/course.csv' 
	into table course_common;

// 3、最后通过insert overwrite给桶表中加载数据
insert overwrite table course 
	select * from course_common cluster by(c_id);

3.3、修改表结构

3.3.1、修改表名字
3.3.2、增加\修改列信息

4、Hive查询语法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值