离线数仓DIM层和DWD层,联表后表和字段命名规则
文章目录
- DIM层
- DWD层
DIM层
- 1个维度表约30个字段
3个维度表约100个字段
CREATE EXTERNAL TABLE `ods_a_full` (`id` STRING COMMENT '主键',`name` STRING COMMENT '名称'
) COMMENT 'a信息'
PARTITIONED BY (`ymd` STRING);CREATE EXTERNAL TABLE `ods_b_full` (`id` STRING COMMENT '主键',`name` STRING COMMENT '名称',`a_id` STRING COMMENT '关联a.id'
) COMMENT 'b信息'
PARTITIONED BY (`ymd` STRING);CREATE EXTERNAL TABLE `ods_c_full` (`id` STRING COMMENT '主键',`name` STRING COMMENT '名称',`b_id` STRING COMMENT '关联b.id'
) COMMENT 'c信息'
PARTITIONED BY (`ymd` STRING);
若
a
一对多b
一对多c
则
c
是最细维度
则
c
左联b
左联a
左联后
命名取最细粒度c
前缀dim
,全量维度表后缀full
,拉链表后缀zip
则全名为dim_c_full
建表
1、完全复制3个表的字段,不同表要隔开,顺序cba
,c
表主键字段排在字段第一
2、不同维度表的字段名会重名(例如上面都有name
),对此,所有字段前缀加上源表名,如:c_
、b_
、a_
3、注释掉所有外键
4、添加压缩和列式存储
CREATE EXTERNAL TABLE `dim_c_full` (
-- ods_c_full`c_id` STRING COMMENT 'c主键',`c_name` STRING COMMENT 'c名称',-- `c_b_id` STRING COMMENT '关联b.id'
-- ods_b_full`b_id` STRING COMMENT 'b主键',`b_name` STRING COMMENT 'b名称',-- `b_a_id` STRING COMMENT '关联a.id'
-- ods_a_full`a_id` STRING COMMENT 'a主键',`a_name` STRING COMMENT 'a名称'
) COMMENT 'c维度'
PARTITIONED BY (`ymd` STRING)
-- 列式存储和snappy压缩
STORED AS ORC
TBLPROPERTIES('orc.compress'='snappy');
- SQL
1、WITH AS
结构
2、JOIN
结构
3、SELECT FROM WHERE
结构
WITH
c AS (SELECTFROM ods_c_fullWHERE ymd='{ymd}'
),
b AS (SELECTFROM ods_b_fullWHERE ymd='{ymd}'
),
a AS (SELECTFROM ods_a_fullWHERE ymd='{ymd}'
)
SELECT-- ods_c_full-- ods_b_full-- ods_a_fullFROM c
LEFT JOIN b ON b.`id`=c.`b_id`
LEFT JOIN a ON a.`id`=b.`a_id`;
- 最终sql
WITH
c AS (SELECT`id`,`name`,`b_id`FROM ods_c_fullWHERE ymd='{ymd}'
),
b AS (SELECT`id`,`name`,`a_id`FROM ods_b_fullWHERE ymd='{ymd}'
),
a AS (SELECT`id`,`name`FROM ods_a_fullWHERE ymd='{ymd}'
)
INSERT OVERWRITE TABLE dim_c_full PARTITION(ymd='{ymd}')
SELECT-- ods_c_fullc.`id` AS c_id,c.`name` AS c_name-- ods_b_full,b.`id` AS b_id,b.`name` AS b_name-- ods_a_full,a.`id` AS a_id,a.`name` AS a_name
FROM c
LEFT JOIN b ON b.`id`=c.`b_id`
LEFT JOIN a ON a.`id`=b.`a_id`;
- 联表后校验
若
ods_c_full
表为m行,联表后dim_c_full
为n行
则
必须要满足m=n(若n>m,则说明笛卡儿积)
如果维度表只被用1次,可以试试视图?
CREATE OR REPLACE VIEW `view_dim_c_full` (-- ods_c_full`c_id` COMMENT 'c主键',`c_name` COMMENT 'c名称',-- ods_b_full`b_id` COMMENT 'b主键',`b_name` COMMENT 'b名称',-- ods_a_full`a_id` COMMENT 'a主键',`a_name` COMMENT 'a名称'
) COMMENT 'c维度' AS
WITH
c AS (SELECT`id`,`name`,`b_id`FROM ods_c_fullWHERE ymd='{ymd}'
),
b AS (SELECT`id`,`name`,`a_id`FROM ods_b_fullWHERE ymd='{ymd}'
),
a AS (SELECT`id`,`name`FROM ods_a_fullWHERE ymd='{ymd}'
)
SELECT-- ods_c_fullc.`id` AS c_id,c.`name` AS c_name-- ods_b_full,b.`id` AS b_id,b.`name` AS b_name-- ods_a_full,a.`id` AS a_id,a.`name` AS a_name
FROM c
LEFT JOIN b ON b.`id`=c.`b_id`
LEFT JOIN a ON a.`id`=b.`a_id`;
DWD层
ods层,d
为事实表
CREATE EXTERNAL TABLE `ods_d_i` (`id` STRING COMMENT '主键',`name` STRING COMMENT '名称',`create_time` STRING COMMENT '创建时间',`c_id` STRING COMMENT '关联c.id'
) COMMENT 'd事实'
PARTITIONED BY (`ymd` STRING);
ods和dim层联表得到dwd层,主名用事实,表的全名dwd_d_i
事实表d
字段名不变,维度表c
的字段名沿用dim层的字段名
合并后,注释掉事实表的外键
CREATE EXTERNAL TABLE `dwd_d_i` (
-- 事实表`id` STRING COMMENT '主键',`name` STRING COMMENT '名称',`create_time` STRING COMMENT '创建时间',-- `c_id` STRING COMMENT '关联c.id',
-- 维度表`c_id` COMMENT 'c主键',`c_name` COMMENT 'c名称',`b_id` COMMENT 'b主键',`b_name` COMMENT 'b名称',`a_id` COMMENT 'a主键',`a_name` COMMENT 'a名称'
) COMMENT 'd事实'
PARTITIONED BY (`ymd` STRING);
事实表d
左联维度表c
SQL结构
WITH
c AS (SELECTFROM dim_c_fullWHERE ymd='{ymd}'
),
d AS (SELECTFROM ods_d_iWHERE ymd='{ymd}'
)
INSERT OVERWRITE TABLE dwd_d_i PARTITION(ymd='{ymd}')
SELECTFROM d
LEFT JOIN c ON c.`c_id`=d.`c_id`;
离线数仓DIM层和DWD层,联表后表和字段命名规则相关推荐
- HIve数仓新零售项目DWD层的构建
HIve数仓新零售项目 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统 ...
- 离线数仓12—— 数仓开发之DWD层
文章目录 第9章 数仓开发之DWD层 9.1 交易域加购事务事实表 9.2 交易域下单事务事实表 9.3 交易域取消订单事务事实表 9.4 交易域支付成功事务事实表 9.5 交易域退单事务事实表 9. ...
- 大数据-案例-离线数仓-在线教育:MySQL(业务数据)-ETL(Sqoop)->Hive数仓【ODS层-数据清洗->DW层(DWD-统计分析->DWS)】-导出(Sqoop)->MySQL->可视化
一.商业BI系统概述 商业智能系统,通常简称为商业智能系统,是商业智能软件的简称,是为提高企业经营绩效而采用的一系列方法.技术和软件的总和.通常被理解为将企业中的现有数据转换为知识并帮助企业做出明智的 ...
- 离线数仓搭建_11_DWD层用户行为日志创建
文章目录 13.0 数仓搭建-DWD层 13.1 DWD层(用户行为日志) 13.1.1 日志解析思路 13.1.2 get_json_object函数使用 13.1.3 启动日志表 13.1.4 页 ...
- 【离线数仓-9-数据仓库开发DWS层设计要点-1d/nd/td表设计】
离线数仓-9-数据仓库开发DWS层设计要点-1d/nd/td表设计 离线数仓-9-数据仓库开发DWS层设计要点-1d/nd/td表设计 一.DWS层设计要点 二.DWS层设计分析 - 1d/nd 1. ...
- 离线数仓(10):ODS层实现之业务数据核对
目录 0. 相关文章链接 1. 目的 2. 调度任务创建 2.1. 概述 2.2. ods_fmys_goods_ext_数据核对_CDM任务 节点说明 2.3. ods_fmys_goods_ext ...
- 【数据仓库】数仓到底要分多少层
0.前言 初学数仓的同学都喜欢问一个很有意思的问题:数据仓库到底要分几层?我一般的回答都是:你想分几层就分几层.很显然, 虽然我是很认真的在回答,但是提问题的人会感觉非常不认真.还是完完整整的阐述一下 ...
- 尚硅谷-离线数仓-笔记
尚硅谷-离线数仓-笔记 一.数仓建模理论 第一章 数仓概述 1.1 数仓概念 数据仓库是一个为数据分析而设计的企业级数据管理系统.数据仓库可集中.整合多个信息源的大量数据,借助数据仓库的分析能力,企业 ...
- 离线数仓建设及技术选型
离线数仓架构设计 1.建设数仓的目的 主要是增加数据计算的复用性.每次新增加统计需求时,不至于从原始数据进行计算,而是从半成品继续加工而成. 2. 数据仓库作用 整合企业业务数据,建立统一的数据中心: ...
- 离线数仓模型构建的简单见解
离线数仓模型构建的简单见解 1.业务数据与架构变化情况说明 2.数据分层说明 2.1 ods层模型说明 2.2 dim层模型说明 2.2.1 json 解析打宽成json基础表与分类拆解或合并 2.2 ...
最新文章
- hadoop学习-Netflix电影推荐系统
- 【技术综述】人脸年龄估计研究现状
- Windows服务启动进程----Cjwdev.WindowsApi.dll
- 最稳妥的服务器阵列方案:RAID5+热备盘
- MATLAB矩阵的算术运算
- Java基础学习总结(64)——Java内存管理
- 实现Apriori算法(python)
- javascript移动设备触屏事件
- CodeIgniter的缓存小记
- 后端要学MySQL_后端程序员需要掌握MySQL数据库吗
- 0ctf – mobile – boomshakalaka writeup
- SHELL脚本获取某天的上一周日期(星期一为第一天)
- Windows关机或重启显示有程序正在阻止、程序失去响应
- ECC原理和RocketChip Cache ECC实现
- 为什么Spark这么牛逼?
- 微信小程序开发之——音乐播放器-音乐推荐
- db2关闭下一句sql的日志_分析DB2活动日志满的原因及解决DB2日志满方法与避免方案...
- 树莓派4B摄像头安装和使用方法详解(支持拍照,录像,实时监控)
- JAVA uni-push
- 杂乱无章原因简要分析
热门文章
- unity3d内建着色器源码解析(一)
- 我对“结构化思维”的理解 - 直播分享
- Python关于socket的一个小型服务器和客户机实例
- join and list删除 and set集合 and 深浅拷贝
- linux系统u盘安装教程图解教程,使用U盘安装Ubuntu的详细图文教程
- 青岛科技大学计算机转专业,2021年青岛科技大学大一新生转专业及入学考试相关规定...
- python实现下载压缩包并且解压
- window中的DLL和linux中的os文件是什么东西
- Going Deeper with Convolutions——GoogLeNet论文翻译——中文版
- 今年过年不送礼,送礼就送......