数据仓库和数据库
数仓和数据库的区别
数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别
- 操作型处理(数据库),叫联机事务处理OLTP(On-Line Transaction Processing),也可以称面向用户交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常进行增删改查操作。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。
- 分析型处理(数据仓库),叫联机分析处理OLAP(On-Line Analytical Processing),也可以称为面向专业分析人员进行数据分析,通常进行查询分析操作,一般针对某些主题的历史数据进行分析,支持管理决策。
- 数据仓库主要特征:面向主题的(Subject-Oriented)、集成的(Integrated)、非易失的(Non-Volatile)和时变的(Time-Variant)
- 数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的。
- 数据仓库的出现,并不是要取代数据库,主要区别如下:
数据库是面向事务的设计,数据仓库是面向主题设计的。数据库一般存储业务数据,数据仓库存储的一般是历史数据。数据库是为捕获数据而设计,数据仓库是为分析数据而设计数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数仓的分层架构
数据仓库架构可分为三层——源数据层、数据仓库层、数据应用层:
- 源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
- 数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
- 数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
ETL和ELT
- 数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extract,转化Transform ,装载Load)的过程。
但是在实际操作中将数据加载到仓库却产生了两种不同做法:ETL和ELT。 - ETL:先从数据源池中抽取数据,数据保存在临时暂存数据库中(ODS)。然后执行转换操作,将数据结构化并转换为适合目标数据仓库系统的形式,然后将结构化数据加载到数据仓库中进行分析。
- ELT:从数据源中抽取后立即加载。没有专门的临时数据库(ODS),这意味着数据会立即加载到单一的集中存储库中,数据在数据仓库系统中直接进行转换,然后进行分析
数据库操作
- 创建库的语法为
CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION position];
- 删除库的语法为
DROP DATABASE db_name [CASCADE];
- 数据库和HDFS的关系
- Hive的库在HDFS上就是一个以.db结尾的目录
- 默认存储在:/user/hive/warehouse内
- 可以通过LOCATION关键字在创建的时候指定存储目录
数据表操作
表操作语法和数据类型
- 创建表的语法
- 数据类型
内部表和外部表区别
- Hive表的类型?
- 内部表(MANAGED_TABLE)
- 未被external关键字修饰的即是内部表,内部表又称管理表或者托管表。删除内部表:直接删除元数据和存储的业务数据
- 分区表
- 分桶表
- 外部表(EXTERNAL_TABLE)
- 被external关键字修饰的即是外部表,外部表又称非管理表或者非托管表。删除外部表:仅仅是删除元数据,存储的业务数据并不会被删除
- 分区表
- 分桶表
在HDFS的表默认存储路径:/user/hive/warehouse/库名.db
- 查看表类型和详情:
- DESC FORMATTED表名;
- 内部表区别?
内部表
创建内部表:
create table [if not exists]
内部表名
(字段名字段类型, …
)…;
-
复制内部表:
-
复制表结构:
-
CREATE TABLE 表名 like 存在的表名;
-
复制表结构和数据:
-
CREATE TABLE 表名 as select 语句;
删除内部表:
drop table 内部表名;
查看表格式化信息:
desc formatted 表名;
truncate清空内部表数据:
truncate table 内部表名;
外部表
创建外部表:
create
external table [if not exists] 内部表名(
字段名 字段类型, …
)…;
-
复制外部表:
- 复制表结构:
-
CREATE EXTERNAL TABLE 表名 like 存在的表名;
删除外部表:
drop table 外部表名;
查看表格式化信息:
desc formatted 表名;
注意:外部表不能使用truncate关键字清空数据
映射表
数据加载 -LOAD语法
使用LOAD语法,从外部将数据加载到Hive内,语法如下: