一、分层
理论上分为三层:ODS数据运营层,DW数据仓库层,ADS数据服务层.
数据运营层(ODS):原始数据:
ODS:Operation Data Store 数据准备区,也称为贴源层。数据仓库源头系统的数据表通常会原封不动的存储一份,这称为ODS层,是后续数据仓库加工数据的来源。
数据仓库层(DW):数据清洗:
- DWD:data warehouse details 细节数据层,是业务层与数据仓库的隔离层。主要对ODS数据层做一些数据清洗和规范化的操作。
数据清洗:去除空值、脏数据、超过极限范围的 - DWB:data warehouse base 数据基础层,存储的是客观数据,一般用作中间层,可以认为是大量指标的数据层。
- DWS:data warehouse service 数据服务层,基于DWB上的基础数据,整合汇总成分析某一个主题域的服务数据层,一般是宽表。用于提供后续的业务查询,OLAP分析,数据分发等。
数据服务层/应用层(ADS):出报表
ADS:applicationData Service应用数据服务,该层主要是提供数据产品和数据分析使用的数据,一般会存储在ES、mysql等系统中供线上系统使用。
二、内部表vs外部表
1、内部表
内部表,也叫托管表,是Hive在创建表时的默认表。
特点:在内部表被删除后,表的元数据和表数据都从HDFS中完全删除
建表代码:
create table if not exists 表名(
字段名称 字段类型,
...
字段名称 字段类型
)
comment 表的注释
raw format delimited
fields terminated by '分隔符' #列以'分隔符'分割
line terminated by '分隔符' #此分隔符只能是‘\n’,目前hive只支持‘\n’,行分割也是默认‘\n’
stored as 文件存储类型 #常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、 #TEXTFILE(文本)、RCFILE(列式存储格式文件)如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
适用场景:
ETL数据清理是用内部表做中间表,清理时HDFS上的文件同步删除
查看所建的表的全部信息----其中Table Type 表示表的类型
(内部表Internal TABLE/Managed TABLE,外部表EXTERNAL TABLE)
内部表数据存储的位置是hive.metastore.warehouse.dir,如果创建内部表时没有指定location,就会在/user/hive/warehouse/下新建一个表目录
2、外部表
特点:表中的数据在删除后仍然在HDFS中。
如果我们创建一个外部表,在删除表之后,只有与表相关的元数据被删除,而不会删除表的内容。
声明外部表的关键字:external
声明外部表的基本语法:
create external table if not exists 表名(
字段名称 字段类型,
...
字段名称 字段类型
)
raw format delimited
fields terminated by '分隔符'
将数据加载至hive表中
hive> load data local inpath '/opt/student.txt' into table student2;
将外部表删除
hive> drop table student2;
查看HDFS路径下是否保留表数据
[root@master ~]# hadoop fs -cat /data/hive/warehouse/student2/student.txt
外部表适用场景:
对于恢复误删的数据困难的情况,例如:实时采集的数据
外部表的优点:
可以共享数据,且不加载到hive中,减少数据加载,落地
3、管理表(内部表)与外部表互相转换
查询已有表的类型
hive> desc formatted student;
修改内部表student为外部表
hive> alter table student set tblproperties('EXTERNAL'='TRUE');
修改外部表student为内部表
hive> alter table student set tblproperties('EXTERNAL'='FALSE');
三、分区
静态分区
创建分区表语法
create table stu(id string,name string) partitioned by (month string) row format delimited fields terminated by '\t';
加载数据
hive> load data local inpath '/home/test/stu.txt' into table student partition(classroom='002');
Loading data to table default.student partition (classroom=002)
OK
Time taken: 1.102 seconds
查看分区
hive> show partitions student;
OK
classroom=002
Time taken: 0.071 seconds, Fetched: 1 row(s)
新增分区
alter table salary add partition(data_dt = '2021-07-22');
向分区表插入数据:
insert into salary partition(data_dt='2021-07-19') values ('10001','Eric',150000);
动态分区
启用hive动态分区(之前博客也写过)
在hive会话中设置两个参数:
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict;
不指定具体的学校和班级,让系统自动分配;
hive> insert overwrite table stu01 partition(school,classroom)
> select * from stu;
插入数据时字段要对应分区名
insert into student partition(address,school) select name,age,'shanghai' as address,school from stu;