数据仓库数据清洗之码值映射

来源:互联网 发布:网络安全法解读 ppt 编辑:程序博客网 时间:2024/04/30 02:27

一、映射表F_CM_CODE_MAPPING

1. 源系统码值与目标码值映射关系表结构

不建议将源表码值和目标码值分两个表进行关联,设计建议参考F_CM_CODE_MAPPING


这个有问题,需要增加目标描述字段

 

2. 源系统码值与目标码值映射关系表生成

         2.1 源系统多个码值对应一个目标码值 or 源系统的码值不在码表中保存而在注释中——手工维护映射表。

 

         2.2 源系统码值和目标码值一一对应(目标码值就是源系统码值)——ETL直抽到映射表中。

 

EG:

         SQOOP方案:为减少SQOOP任务将ODS所有码值一起抽取,代码如下。

sqoop import -D mapred.job.queue.name=${queueName} \

--connect ${oracle_connection} \

--username ${oracle_username} \

--password ${oracle_password} \

--query "select \

系统A,\

表A,\

“字段名a” ,\

字段a,\

字段a描述,\

“字段名a” ,\

字段a,\

字段a描述,\

数据日期\

from 表A

 

union all

 

系统A,\

表B,\

“字段名b” ,\

字段b,\

字段b描述,\

“字段名b” ,\

字段b,\

字段b描述,\

数据日期\

from 表 B

………

 

 

二、新增码值自动检查方案

       在源系统码值与目标码值映射关系表生成的第一种情况,即手工维护映射表时,源系统新增了码值,数据仓库是发现不了的。故增加下面的机制检查新增的码值。

 

第一步:

         将ODS中所有的码值表抽取到数仓中的CODE_SOURCE表。

 

         Eg:

         数仓中SQOOP目标表CODE_SOURCE表结构src_sys, src_tbl,field_en, field_value

         SQOOP方案:为减少SQOOP任务将ODS所有码值一起抽取,代码如下。

sqoop import -D mapred.job.queue.name=${queueName} \

--connect ${oracle_connection} \

--username ${oracle_username} \

--password ${oracle_password} \

--query "select \

系统A,\

表A,\

“字段名a” ,\

字段a,\

from 表A

 

union all

 

系统A,\

表B,\

“字段名b” ,\

字段b,\

from 表 B

………

               

第二步:

         将数仓中CODE_SOURCE与数仓中F_CM_CODE_MAPPING关联,CODE_SOURCE中多余的码值便是新增的码值。

 

         Eg:

配置任务检查CODE_SOURCE关联F_CM_CODE_MAPPING,F_CM_CODE_MAPPING中字段取数字段的值为空的,即表示源头新增了码值。

Select* from CODE_SOURCE  A  left join F_CM_CODE_MAPPING  B  onA. src_sys=B. src_sys  and  A. src_tbl=B. src_tbl  and  A.field_en =B. field_en

WhereB. field_value is NULL;

 

         查询过程举例:标红的行即为源系统新增的码值。

 

三、 码值表

         在主题层向外提供数据时,同时需要提供对应的码值表,数据仓库的码值表实现方案是通过对映射表F_CM_CODE_MAPPING进行加工的。

 

         EG:

SELECTDISTINCT 标准码值, 标准码值类型, 标准码值描述

FROMF_CM_CODE_MAPPING

0 0