数据建模工具-PDManer使用技巧-贴源层


摘要: 数据建模工具-PDManer使用技巧-贴源层

关键词: 数据建模 数据治理 数据模型 数据字典 数据血缘

一、总体介绍

在数据治理过程中,我们经常和数据模型打交道,这时候我们就需要一个好的工具,来完成建模这个过程,PDManer就是本文的主角。
在数据治理过程中,分成贴源层、模型层、指标层等,这里就以贴源层为例介绍工具:

二、软件下载

官方网站:https://www.pdmaas.cn/home

个人使用,选择免费版本即可

如果需要多人协同,可以选择 PDMaas 私有云版本

三、使用技巧

3.1、贴源层

3.1.1、数据模型

a.新建项目

新建"XX项目贴源层",如下图
贴源层特点: 和源系统保持一致,所以我们这层的模型采用数据库导入方式生成,不自己新增字段

b.新增数据库连接

进入项目之后
依次点击:①数据库 -> ②新增 -> ③添加数据库
因为我的数据来源是Mysql,所以我连接了Mysql,并且这个数据库是测试数据库,我把生产的数据表结构,在测试数据库已经新建完毕。

c.新增主题域

这里的主题域,并不是模型层的意义,我们按照应用来区分
依次点击: ①点击左侧空白处,新增 -> ②数据应用贴源层表前缀 -> ③应用名称

d.导入数据模型

依次点击: ①导入 -> ②从数据库连接逆向解析

依次点击: ①选择全小写 -> ②下一步

依次点击:①输入你想要的表名 -> ②选中多个表 -> ③批量调整 -> ④全选 -> ⑤选择主题域 -> ⑥选择前面新建的应用,点击确定

依次点击:显示三张表导入成功,确定

依次点击:①点击表模型 -> ②修改表前缀 -> ③修改表注释

从上面截图可以看到,贴源层的表模型都已经成功导入,并且按照贴源层的规范,修改了表前缀。

3.1.2、数据库代码

a.建表语句

依次点击:①数据库代码 -> ②MYSQL -> 看到建表语句

b.Hive外部表建表语句

当我们使用hive表的时候,我们通常有自己的规范,PDmaner自带的已经不支持了
所以我们新增类型
依次点击:①点击类型设置 -> ②数据库,点击新增 -> ③填写数据库(Hive(XX规范)) -> ④预览编辑 -> ⑤输入代码
代码内容如下

{{
    let partitionedBy = it.entity.properties['partitioned by'];
    partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';
    let defOds = it.entity.properties['defOds'];
    defOds = defOds?defOds:'请在扩展属性中配置[defOds]属性';
}}

drop table if exists {{=it.entity.defKey}};
create external table if not exists {{=it.entity.defKey}}(
   `cd_id` string COMMENT '集成记录唯一值',
   `cd_time` string COMMENT '集成记录时间',
   `cd_info` string COMMENT '集成记录信息',
{{ pkList = [] ; }}

{{~it.entity.fields:field:index}}
   `{{=it.func.lowerCase(field.defKey)}}` string comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}
{{~}}
{{? pkList.length >0 }}
{{?}}
)

comment '{{=it.func.join(it.entity.defName,';') }}'
stored as parquet
location '/project/shscnq/db/u_ods/{{=it.entity.defKey}}'
;

再返回数据模型
依次点击:①点击表模型 -> ②数据库代码 -> ③Hive(XX规范) -> 可以看到按照XX规范的Hive表数据库代码

这里说一下XX项目贴源层规范:
1.所有Hive表都必须建外部表
2.字段类型必须是String
3.固定三个字段cd_id、cd_time、cd_info
4.外部表前缀 “/project/shscnq/db/u_ods/”
5.必须使用parquet数据格式存储

经过这样的Hive(XX规范)类型增加之后,之后所有的数据模型,都会按照我们的规范来生成,一次修改,后面的建表语句自动生成

3.1.3、业务流程图

随着我们集成到业务数据库的表数据,我们在接入之前,或许已经了解到业务相关流程,也有可能我们根据数据表才能自己嗅探到,这时候我们需要绘制业务流程图,可以绘制流程图或者思维导图,都支持,这次以思维导图为例。
依次点击:①关系图 -> ②新增 -> ③思维导图 -> ④绘制业务

优势:
1.把所有的流程图和建模都汇集在一个工具里,方便
2.他还有逻辑模型、物理模型ER图,都可以在这里绘制

3.1.4、数据源字典

当我们把模型和业务流程图做完之后,我们就开始整理数据源字典了
依次点击:①数据字典 -> ②新增字典 -> ③填写字典代码 -> ④填写字典名称 -> ⑤填写字典各个条目

3.1.5、表格编辑模式

在我们整理数据源字典的时候,我们发现,数据源字典来源方式有很多
1.对方表建表语句备注
2.对方的字典表
3.对方手工给的Excel
所以没法像表一样,都能导入,所以我们可以使用表格编辑模式
依次点击:①表格式编辑

可以像编辑Excel一样编辑,也可以批量粘贴数据

3.1.6、字典转换规则

在数据治理过程中,我们有很大一部分工作就是做数据字典的映射,把各个数据源的字典映射成一个统一的标准字典(这里的标准字典,在模型层维护,在后面会描述),但是这个映射的关系,我们之前都是写在Excel里或者是存储在数据表里,维护比较麻烦。
这里我们可以维护在PDmaner里。
点击一个字典表,进入表格式编辑
①转换目的标准字典表名
②转换目的标准字典表字典编码值
③转换目的标准字典表字典中文值

3.1.7、字典导出

到这里就会有人说了,字典表是维护好了,但是这些字典我要在sql里关联使用呀,怎么导出去,怎么关联啊

a.字典表结构

首先导出去的表需要数据表存储,表结构如下

create table sys_dict
(
    table_name    varchar(255) null comment '维度表名',
    table_comment varchar(255) null comment '维度表注释',
    `desc`        varchar(255) null comment '描述说明',
    version       varchar(255) null comment '版本'
)
    comment '字典总表';
create table sys_dict_item
(
    table_name        varchar(255) null comment '维度表名',
    dim_code          varchar(255) null comment '维度字典编码',
    dim_name          varchar(255) null comment '维度字典名称',
    sort              varchar(255) null comment '排序',
    parent_dim_code   varchar(255) null comment '父级维度字典编码',
    `desc`            varchar(255) null comment '描述',
    enabled           varchar(255) null comment '是否启用',
    version           varchar(255) null comment '版本',
    target_table_name varchar(255) null comment '转换目标表名',
    target_dim_code   varchar(255) null comment '转换目标维度字典编码',
    target_dim_name   varchar(255) null comment '转换目标维度字典名称'
)
    comment '字典明细表';
b.字典导出语句

PDmaner自带导出字典功能
但是表字段和我们的字典表不同,需要修改
依次点击:①设置 -> ②数据字典SQL模板

编辑内容如下

/* 插入字典总表[{{=it.dict.defKey}}-{{=it.dict.defName}}] */
INSERT INTO SYS_DICT(table_name,table_comment,`desc`,version) VALUES('{{=it.dict.defKey}}','{{=it.dict.defName}}','{{=it.dict.intro}}',1);
/* 插入字典明细表 */
{{~it.dict.items:item:index}}
INSERT INTO SYS_DICT_ITEM(table_name,dim_code,dim_name,sort,parent_dim_code,`desc`,enabled,version,target_table_name,target_dim_code,target_dim_name) VALUES('{{=it.dict.defKey}}','{{=item.defKey}}','{{=item.defName}}','{{=item.sort}}','{{=item.parentKey}}','{{=item.intro}}','{{=item.enabled}}',1,'{{=item.attr1}}','{{=item.attr2}}','{{=item.attr3}}');
{{~}}

依次点击:①点击导出 -> ②导出数据字典SQL

依次点击:①选择需要导出的数据字典 -> ②选择字典表

依次点击:①生成DDL -> ②导出,或者选择SQL复制也可以

这样执行这些SQL就能得到所有字典表的数据

3.1.8、单字典生成

字典总表生成之后,还有需求会每个字典,单独生成字典,这样就能够单独使用
通过SQL生成,以下是本人自定义使用,仅供参考

create table sys_dim_template
(
    table_template  longtext null comment '表模板',
    insert_template longtext null comment '插入语句模板',
    table_sql       longtext null comment '建表语句SQL',
    insert_sql      longtext null comment '插入语句SQL',
    table_rows_diff longtext null comment '表条数验证'
);

表模板

DROP TABLE IF EXISTS `${table_name}`;
CREATE TABLE `${table_name}` (
  `id` varchar(64) NOT NULL COMMENT '唯一编号',
  `bm` varchar(100) NOT NULL COMMENT '代码',
  `mc` varchar(255) NOT NULL COMMENT '名称',
  `jc` varchar(100) DEFAULT NULL COMMENT '简称',
  `pyjp` varchar(100) DEFAULT NULL COMMENT '拼音简拼',
  `px` varchar(100) DEFAULT NULL COMMENT '排序',
  `ms` varchar(500) DEFAULT NULL COMMENT '描述',
  `yxx` varchar(10) DEFAULT NULL COMMENT '有效性,0有效,1无效',
  `effdate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `expdate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `sjbm` varchar(100) DEFAULT NULL COMMENT '国家标准编号',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `unique_key` (`bm`,`yxx`)
) ENGINE=InnoDB COMMENT='${table_comment}'
;

插入语句模板

insert into `${table_name}`(`id`,`bm`,`mc`,`jc`,`pyjp`,`px`,`ms`,`yxx`,`expdate`,`sjbm`) values (uuid(),"${KEY_}","${LABEL}","${JC}","${PYJP}","${SORT_}","","0","2097-01-01 00:00:00","");

建表语句SQL

select replace(replace(t2.table_template, "${table_name}", t1.table_name), "${table_comment}", t1.table_comment)
from sys_dict t1
join sys_dim_template t2

插入语句SQL

select
    replace(
            replace(
                    replace(
                            replace(
                                    replace(
                                            replace(t2.insert_template, "${KEY_}", t1.dim_code),
                                            "${LABEL}", t1.dim_name),
                                    "${JC}", pinyin(t1.dim_name)),
                            "${PYJP}", pinyin(t1.dim_name)
                        ),
                    "${SORT_}", t1.sort
                ),
        "${table_name}", t1.table_name
        )
from sys_dict_item t1
join sys_dim_template t2

表条数验证

select
t1.table_name,t1.table_num,t2.TABLE_ROWS
from (
      select table_name, count(*) as table_num
      from SYS_DICT_ITEM
      group by table_name
      order by table_name
    ) t1
left join
    (
      select table_name,TABLE_ROWS
      from information_schema.TABLES
      where TABLE_SCHEMA = 'shscnq_st'
    ) t2
on t1.table_name = t2.table_name

通过执行 “建表语句SQL”和“插入语句SQL”,就能得到各个字典表的建表语句和插入语句,执行之后,所有字典表都能生成了。如果要验证字典的表字典条数和实际生成的字典表条数,可以用“表条数验证”来验证。

我的示例模板 =========模板开始================== package com.sgcc.{{=it.module.name}}.domain; $blankline import javax.persistence.*; import java.io.Serializable; import java.util.Date; import lombok.Data; import org.hibernate.annotations.GenericGenerator; $blankline $blankline /** * 容量电价信息表 * @Column参数: 1. name: 指定映射到数据中的字段名 2. unique: 是否唯一,默认为false 3. nullable: 是否允许为null,默认为true 5. insertable: 是否允许插入,默认为true 6. updatetable: 是否允许更新,默认为true 7. columnDefinition: 指定该属性映射到数据中的实际类型,通常是自动判断。 * @author changjiakang */ @Data @Entity @Table(name="{{=it.entity.title}}") public class {{=it.func.camel(it.entity.title,true) }} implements Serializable{ {{~it.entity.fields:field:index}} /** {{=it.func.join(field.chnname,field.remark,';')}} */ {{? field.pk }} @Id @GeneratedValue(generator = "idGenerator") @GenericGenerator(name = "idGenerator", strategy = "uuid") @Column(name = "ID", nullable = false, length = 32) {{?}} @Column(name = "{{=field.name}}", nullable = true) private {{=field.type}} {{=it.func.camel(field.name,false)}}; {{~}} } $blankline $blankline =================================================== import java.io.Serializable; import java.math.BigDecimal; import lombok.Data; /** * 容量电价信息Vo * @author changjiakang */ @Data public class {{=it.func.camel(it.entity.title,true) }}Vo implements Serializable { {{~it.entity.fields:field:index}} /** {{=it.func.join(field.chnname,field.remark,';')}} */ private {{=field.type}} {{=it.func.camel(field.name,false)}}; {{~}} } =========模板结束================== 四.重命名数据类型,生成Po Vo如果字段类型为空,需要设置所有空字段对应的数据类型 五.生成po vo 六.数据库新加的表需要重新导入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏说大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值