文章目录
- 知识点13:ODS层构建:申明分区代码及测试
- 知识点14:ODS层与DWD层区别
- 知识点15:DWD层构建:需求分析
- 知识点16:DWD层构建:建库实现测试
- 知识点17:DWD层构建:建表实现测试
知识点13:ODS层构建:申明分区代码及测试
-
目标:阅读ODS申明分区的代码及实现测试
-
路径
- step1:代码讲解
- step2:代码测试
-
实施
-
代码讲解
-
step1:为什么要申明分区?
-
表的分区数据由Sqoop采集到HDFS生成AVRO文件
/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas/20210101/part-m-00000.avro
-
HiveSQL基于表的目录实现了分区表的创建
create external table if not exists one_make_ods.ciss_base_areas partitioned by (dt string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' tblproperties ('avro.schema.url'='hdfs:///data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avsc') location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'
-
但是Hive中没有对应分区的元数据,无法查询到数据
-
-
step2:怎么申明分区?
-
Alter Table
alter table 表名 add if not exists partition (dt='值') location 'HDFS上的分区路径'
-
例如
alter table one_make_ods.ciss_base_areas add if not exists partition (dt='20210101') location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas/20210101'
-
-
step3:如何自动化实现每个表的分区的申明?
- 获取分区工具类实例
- 调用申明分区的方法
- 对所有全量表调用申明分区的方法:数据库名称、表名、全量标记、分区值
- 对所有增量表调用申明分区的方法:数据库名称、表名、增量标记、分区值
- 拼接SQL
- 执行SQL
-
-
代码测试
- 注释掉第5 ~ 第6阶段的内容
-
运行代码,查看结果
-
-
小结
- 阅读ODS申明分区的代码及实现测试
知识点14:ODS层与DWD层区别
-
目标:理解ODS层与DWD层的区别
-
路径
- step1:内容区别
- step2:设计区别
- step3:实现区别
-
实施
-
内容区别
- ODS:原始数据
- DWD:对ODS层ETL以后的数据
- 本次数据来源于Oracle数据库,没有具体的ETL的需求,可以直接将ODS层的数据写入DWD层
-
设计区别
- ODS层:Avro格式分区数据表
- DWD层:Orc格式分区数据表
-
实现区别
-
ODS层建表:基于avsc文件指定Schema建表
create external table if not exists one_make_ods.ciss_base_areas partitioned by (dt string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' tblproperties ('avro.schema.url'='hdfs:///data/dw/ods/one_make/avsc/CISS4_CISS_BASE_AREAS.avsc') location '/data/dw/ods/one_make/full_imp/ciss4.ciss_base_areas'
-
DWD层建表:自己指定每个字段的Schema建表
create external table if not exists one_make_dwd.ciss_base_areas(ID string,AREANAME string,PARENTID string,SHORTNAME string,LNG string,LAT string,RANK bigint,POSITION string,SORT bigint ) partitioned by (dt string) stored as orc location '/data/dw/dwd/one_make/ciss_base_areas';
-
-
-
小结
- 理解ODS层与DWD层的区别
知识点15:DWD层构建:需求分析
-
目标:掌握DWD层的构建需求
-
路径
- step1:整体需求
- step2:建库需求
- step3:建表需求
-
实施
-
整体需求:将ODS层的数据表直接加载到DWD层
insert into dwd partition (dt = '20210101') select* from ods where dt=20210101
-
建库需求:创建DWD层数据库one_make_dwd
-
建表需求:将ODS层中的每一张表创建一张对应的DWD层的表
-
问题1:建表的语法是什么?
create external table dwd.tbname(字段名 字段类型 字段注释 ) partitioned by (dt string) location '/data/dw/dwd/one_make/ciss_base_areas';
-
问题2:表的名称名是什么,怎么获取?
- 不分全量和增量
- 所有表的名称都在列表中
-
问题3:表的注释怎么来?
- Oracle元数据中有
-
问题4:表的字段怎么获取?
- Oracle元数据中有
-
问题5:Oracle中的字段类型如果与Hive中的类型不一致怎么办?
- 将Oracle中Hive没有类型转换为Hive的类型
-
-
-
小结
- 掌握DWD层的构建需求
知识点16:DWD层构建:建库实现测试
-
目标:阅读DWD建库代码及实现测试
-
路径
- step1:代码讲解
- step2:代码测试
-
实施
-
代码讲解
-
step1:DWD层的数据库名称是什么,建库的语法是什么?
create database if not exists one_make_dwd;
-
step2:如何实现DWD层数据库的构建?
cHiveTableFromOracleTable.executeCreateDbHQL(CreateMetaCommon.DWD_NAME)
-
-
代码测试
-
注释掉第5.2 ~ 第6阶段的内容
-
运行代码,查看结果
-
-
-
小结
- 阅读DWD建库代码及实现测试
知识点17:DWD层构建:建表实现测试
-
目标:阅读DWD建表代码及实现测试
-
路径
- step1:代码讲解
- step2:代码测试
-
实施
-
代码讲解
-
step1:如何获取所有表名?
allTableName = [i for j in tableNameList for i in j]
- 列表推导式
-
step2:建表的语句是什么,哪些是动态变化的?
create external table if not exists one_make_dwd.ciss_base_areas(ID string comment '字段的注释',AREANAME string comment '字段的注释',PARENTID string comment '字段的注释',SHORTNAME string comment '字段的注释',LNG string comment '字段的注释',LAT string comment '字段的注释',RANK bigint comment '字段的注释',POSITION string comment '字段的注释',SORT bigint comment '字段的注释' ) comment '表的注释' partitioned by (dt string) stored as orc location '/data/dw/dwd/one_make/ciss_base_areas';
- 动态变化的信息如下:
- 表名,表的注释
- 字段
- 路径
- 动态变化的信息如下:
-
step3:怎么获取字段信息?
-
step4:Oracle字段类型与Hive/SparkSQL字段类型不一致怎么办?
- timestamp => long
- number => bigint | dicimal
- other => String
-
step4:HDFS上的路径是什么?
/data/dw/dwd/one_make/tableName
-
step5:如何实现自动化
- 遍历表名,对每张表调用自动化建表的方法:数据库名称、表的名称、None【不分全量或者增量】
- 从Oracle中获取字段名,并实现类型转换
- 添加表的注释、分区信息
- 添加表的存储格式
- 指定表的存储路径
- 执行SQL语句
-
-
代码测试
-
注释掉 第6阶段的内容
-
运行代码,查看结果
-
-
-
小结
- 阅读DWD建表代码及实现测试