ODS公共层作业设计方案

结合目前工作,做个笔记。

1.背景:

ODS层属于贴源层,通常都是全量从业务库抽取到数仓,为了不冗余过多的程序,做成公共作业,只需配置补录表即可。

2.相关参数表:

a).apd.apd_fnd_schedule_parameter:存放作业的一些开始结束时间(这里指传的参数),日期格式,时间偏移量等信息。表结构与数据样例如下:

表结构:

数据样例

 

 

b).apd.apd_ods_parameter:存放数据库连接信息,数据源字段,目标表字段,等信息数据。‘

表结构:

 

 样例数据:

 

ods表,有3个,分别是stg表,正常表,his表,例如test_stg,test,test_his,描述如下:

test_stg:临时表的作用,主要是用来保存从ods导入过来的数据。

test:当前表,保存的最新的数据。

test_his:历史表,以时间作为分区,例如part_dt,格式为yyyy-mm-dd(2019-08-01)。

 

 

 

3.步骤:

a).读取apd.apd_fnd_schedule_parameter里面的信息,获取时间。

SELECT A.PARAMETER_VALUE        AS    START_DATE
      ,B.PARAMETER_VALUE        AS    END_DATE
      ,case when A.FREQUENCY = 'DD' THEN date_format(date_sub(str_to_date(A.PARAMETER_VALUE,'%Y-%m-%d'), interval 1 day),'%Y-%m-%d') 
            when A.FREQUENCY = 'MM' THEN date_format(date_sub(str_to_date(A.PARAMETER_VALUE,'%Y-%m-%d'), interval 1 day),'%Y-%m-%d') 
            when A.FREQUENCY = 'YY' THEN date_format(date_sub(str_to_date(A.PARAMETER_VALUE,'%Y-%m-%d'), interval 1 day),'%Y-%m-%d') 
            ELSE '0'
       END  AS BEFORE_DATE
      ,case when A.FREQUENCY = 'DD' THEN date_format(date_sub(str_to_date(A.PARAMETER_VALUE,'%Y-%m-%d'), interval 1 month),'%Y-%m-%d') 
            when A.FREQUENCY = 'MM' THEN date_format(date_sub(str_to_date(A.PARAMETER_VALUE,'%Y-%m-%d'), interval 1 month),'%Y-%m-%d') 
            when A.FREQUENCY = 'YY' THEN date_format(date_sub(str_to_date(A.PARAMETER_VALUE,'%Y-%m-%d'), interval 1 month),'%Y-%m-%d') 
            ELSE '0'
       END  AS BEFORE_MONTH
      ,REPLACE(A.PARAMETER_VALUE,'-','') AS CUR_DATE_WID
  FROM             ${MDW_SCHEDULE_PARAMETER_TABLE}         A
  LEFT JOIN ${MDW_SCHEDULE_PARAMETER_TABLE} B
    ON A.WORKFLOW_NAME = B.WORKFLOW_NAME AND B.PARAMETER_NAME = '$$LAST_EXTRACT_DATE'
 WHERE A.PARAMETER_NAME = '$$START_EXTRACT_DATE'
   AND A.WORKFLOW_NAME = '${KETTLE_JOB_NAME}'

b).获取apd.apd_ods_parameter里面的信息。

SELECT C.JOB_NAME
      ,C.SRC_NAME
      ,C.SRC_TABLE_NAME
      ,C.SRC_TABLE_COLUMNS
      ,C.TAR_STG_TAB_NAME
      ,C.TAR_ODS_TAB_NAME
      ,C.TAR_HIS_TAB_NAME
      ,C.DB_HOST
      ,C.DB_NAME
      ,C.DB_PASSWORD
      ,C.DB_PORT
      ,C.DB_USER
      ,C.DB_JDBC
      ,C.SPLIT_BY
      ,C.TERMINATED_BY
      ,C.JOIN_CONDITION
      ,C.EXTRACT_MODE
      ,C.INCREMENT_FIELD
      ,C.PARAR_NUM
      ,C.TAB_OR_VIEW
      ,C.QUERY_STATEMENT
      ,C.SRC_DB_TYPE
      ,C.TARGET_DIR
      ,C.FETCH_SIZE
      ,C.SET_ENGINE
      ,C.TAR_TABLE_COLUMNS
      ,C.OTHER_PARAMETER
  FROM APD_ODS_PARAMETER              C 
 WHERE  C.JOB_NAME = '${KETTLE_JOB_NAME}';

c).通过sqoop工具,将业务库的数据导入到大数据平台的表。

sqoop import   \ 
--hive-import  \
--hive-table ${TAR_STG_TAB_NAME}   \
--hive-drop-import-delims  \
--hive-overwrite  \
--connect '${DB_JDBC}'   \
--username ${DB_USER}   \
--password ${DB_PASSWORD}  \
--query '${QUERY_STATEMENT}'  \
--target-dir ${TARGET_DIR}  \
--delete-target-dir   \
--null-string '\\N'   \
--null-non-string '\\N'   \
--fields-terminated-by '${TERMINATED_BY}'   \
--split-by ${SPLIT_BY} -m ${PARAR_NUM} \
--fetch-size ${FETCH_SIZE} \
--hive-drop-import-delims --lines-terminated-by '\n'  \
--mapreduce-job-name ${JOB_NAME}  \
 ${OTHER_PARAMETER}

 

d).然后通过hive层面的语法,将ods的stg表同步到正常表,跟his表中。

 

 

 

--TO_ODS_ALL
set hive.execution.engine = ${SET_ENGINE};
set spark.app.name = ${JOB_NAME};
set mapred.job.name=${JOB_NAME}:TO_ODS_ALL; 
set mapreduce.job.queuename=${MDW_DEFAULT_QUEUE};

INSERT OVERWRITE TABLE ${TAR_ODS_TAB_NAME}
SELECT ${TAR_TABLE_COLUMNS} FROM ${TAR_STG_TAB_NAME}




--ODS_HIS_ALL
set hive.execution.engine = ${SET_ENGINE};
set spark.app.name = ${JOB_NAME};
set mapred.job.name=${JOB_NAME}:ODS_HIS_ALL; 
set mapreduce.job.queuename=${MDW_DEFAULT_QUEUE};

INSERT OVERWRITE TABLE ${TAR_HIS_TAB_NAME}  PARTITION (PART_DT='${START_DATE}')
SELECT * FROM ${TAR_ODS_TAB_NAME}

 

 

 

sqoop参数参考地址:http://www.360doc.com/content/16/1116/10/37253246_606951065.shtml

 

posted @ 2021-09-30 15:50  McGREDY  阅读(252)  评论(0)    收藏  举报