数仓模型HIVE业务元数据治理:专题构建方案

Posted 小基基o_O

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数仓模型HIVE业务元数据治理:专题构建方案相关的知识,希望对你有一定的参考价值。

文章目录

概述

库的划分

  • 在数据仓库中,用不同的库来存储不同业务的数据,期望做到不同库的表之间不会有关联
  • 一家公司可能有多个业务系统,例如:HR系统、商业系统……
    对此,建立商业库dw01_biz和HR库dw02_hr,期望dw01_biz.表dw02_hr.表不会JOIN到一起

专题

  • 专题是指针对某个特定对象而特别收集制作而成的一种集中作品
    这个对象可以是具体的某个人物或者某个事物,也可以是某个抽象的范围或者领域
  • 在数据仓库,当同一个库中的表过多时,就需要对表进行归类
    而这个归类是抽象的、逻辑的,默认情况下不是物理的
  • 数仓分层可理解为:按照有序的计算流程,对表进行归类
    例如ODS=>DWD=>DWS=>ADS是有序的计算流程,分层名可添加到表名中,例如ods_user
  • 数仓的英文概念说到,Data warehouse is subject-oriented
    就是说,数据仓库是面向专题的
  • 专题划分:依据(子)业务流程,将数据划分到不同的区域
    专题的划分可以 多维度(按业务、按部门)、多层级(一级部门、二级部门)
    通常,1个表属于1个专题
  • 一些文章提及数据域主题主题域等概念,在我看来 它们和专题差别不大,都属于业务元数据

如果说数仓分层横向划分,那么专题就是纵向划分

商业专题业务过程命名参考
交易加购、下单、取消订单、支付成功、退单、退款成功trade
流量页面浏览、启动应用、动作、曝光、错误traffic
用户注册、登录user
互动收藏、评价interaction
优惠优惠券领取、优惠券使用(下单)、优惠券使用(支付)、满减活动discount
商品上架、下架goods
物流库存、出货、进货logistics
广告advertising
……
其它others

构建专题

  • 分层和专题都是逻辑上对表进行归类,是抽象的,默认情况不是物理的
  • 分层(相对地)脱离业务,有(相对)统一的标准,是稳定的、少变的
    因此分层可作为表名的一部分
    分层还能手动设计为物理意义上的划分(例如建表时指定LOCATION
  • 专题的设计跟业务挂钩,不同的公司有不同的业务,没有统一的标准
    对同一业务,不同的人有不同的理解
    业务和需求是多变的
    因此专题是不稳定的、多变的
    因此专题不适合作为表名的一部分,不适合进行物理意义上的划分
  • 对于由HIVE构建的数仓,可借助TBLPROPERTIES来构建专题
    下面以category单词构建专题,附加到HIVE表属性,也可以用其它单词,如:subject

HIVE建表时,添加专题

TBLPROPERTIES('category1'='类别1','category2'='类别2')

HIVE建表后,补充专题

ALTER TABLESET TBLPROPERTIES('category1'='类别1');
ALTER TABLESET TBLPROPERTIES('category2'='类别2');

专题展示

表信息

SELECT
	t.`TBL_NAME`      AS `表名`
	,c.`PARAM_VALUE`  AS `表注释`
	,c1.`PARAM_VALUE` AS `一级分类`
	,c2.`PARAM_VALUE` AS `二级分类`
FROM (SELECT `DB_ID` FROM `DBS` WHERE `NAME`='库名')b
LEFT JOIN(SELECT `DB_ID`,`TBL_ID`,`TBL_NAME` FROM `TBLS` WHERE `TBL_TYPE`='EXTERNAL_TABLE')t ON b.`DB_ID`=t.`DB_ID`
LEFT JOIN(
	SELECT `TBL_ID`,`PARAM_VALUE`
	FROM `TABLE_PARAMS`
	WHERE `PARAM_KEY`='comment'
)c ON t.`TBL_ID`=c.`TBL_ID`
LEFT JOIN(
	SELECT `TBL_ID`,`PARAM_VALUE`
	FROM `TABLE_PARAMS`
	WHERE `PARAM_KEY`='category1'
)c1 ON t.`TBL_ID`=c1.`TBL_ID`
LEFT JOIN(
	SELECT `TBL_ID`,`PARAM_VALUE`
	FROM `TABLE_PARAMS`
	WHERE `PARAM_KEY`='category2'
)c2 ON t.`TBL_ID`=c2.`TBL_ID`;

字段信息

SELECT
    t.`TBL_NAME`     AS `表名`
    ,c.`COL_NAME`    AS `字段名`
    ,c.`COL_COMMENT` AS `字段注释`
    ,c.`DATA_TYPE`   AS `数据类型`
    ,c.`COL_TYPE`    AS `字段类型`
-- 库
FROM (SELECT `DB_ID` FROM `DBS` WHERE `NAME`='库名') b
-- 表
INNER JOIN (SELECT `DB_ID`,`TBL_ID`,`TBL_NAME` FROM `TBLS` WHERE `TBL_TYPE`='EXTERNAL_TABLE'
) t ON b.`DB_ID`=t.`DB_ID`
-- 字段注释
LEFT JOIN((
    -- 分区注释
    SELECT
        `TBL_ID`,                         -- 表ID
        `PKEY_NAME`      `COL_NAME`,      -- 分区名
        `PKEY_COMMENT`   `COL_COMMENT`,   -- 分区注释
        `PKEY_TYPE`      `DATA_TYPE`,     -- 数据类型
        'partition'      `COL_TYPE`       -- 类型
    FROM `PARTITION_KEYS`
    )UNION ALL(
    -- 列注释
    SELECT
        t.`TBL_ID`       `TBL_ID`,        -- 表ID
        c.`COLUMN_NAME`  `COL_NAME`,      -- 字段名
        c.`COMMENT`      `COL_COMMENT`,   -- 字段注释
        c.`TYPE_NAME`    `DATA_TYPE`,     -- 字段的数据类型
        'column'         `COL_TYPE`       -- 类型
    FROM (
        SELECT b.`TBL_ID`,s.`CD_ID` FROM `TBLS`b
        INNER JOIN `SDS`s ON s.`SD_ID`=b.`SD_ID`
    )t
    LEFT JOIN `COLUMNS_V2`c ON t.`CD_ID`=c.`CD_ID`
))c ON t.`TBL_ID`=c.`TBL_ID`;

Superset可视化效果

以上是关于数仓模型HIVE业务元数据治理:专题构建方案的主要内容,如果未能解决你的问题,请参考以下文章

万字讲解数仓治理及成本管理

网易严选离线数仓治理实践

数据仓库面试题

数仓 | 数据模型OneData实践

搜狐 Hive SQL 血缘关系解析与应用

搜狐 Hive SQL 血缘关系解析与应用