Hive数仓

本文详细解释了Hive中的数据分层架构(ODS、DW、ADS),以及内部表和外部表的区别,包括其特点、适用场景和相互转换。同时介绍了静态分区和动态分区的创建与操作方法。
摘要由CSDN通过智能技术生成

一、分层

理论上分为三层:ODS数据运营层,DW数据仓库层,ADS数据服务层.

数据运营层(ODS):原始数据:

  ODS:Operation Data Store 数据准备区,也称为贴源层。数据仓库源头系统的数据表通常会原封不动的存储一份,这称为ODS层,是后续数据仓库加工数据的来源。

数据仓库层(DW):数据清洗:

  1. DWD:data warehouse details 细节数据层,是业务层与数据仓库的隔离层。主要对ODS数据层做一些数据清洗和规范化的操作。
    数据清洗:去除空值、脏数据、超过极限范围的
  2. DWB:data warehouse base 数据基础层,存储的是客观数据,一般用作中间层,可以认为是大量指标的数据层。
  3. 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; 
  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值