sqoop--数据导入项目

版权声明:本文为博主原创文章,出处为 http://blog.csdn.net/silentwolfyh https://blog.csdn.net/silentwolfyh/article/details/86502037

目录

1、需求

2、架构和步鄹

3、细化步鄹讲解



1、需求

近期公司需要抽取mysql和SqlServer数据到hive中,且将数据处理过程成需要进行加密脱敏。

2、架构和步鄹

在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、细化步鄹讲解

1、源数据到stage

功能描述:抽取关系型数据库中数据(全量或增量)
启动方式:extract   -n   stageDataBaseName  -s       stageTableName   -i     hiveTable  -d   hivedate    -t         i/a/init
启动说明:脚本名称   参数      数据库名称       参数      表名称          参数     hive表名  参数      时间    参数       增量/全量/初始化
脚本步鄹:
1、从数据库中获取ip,user_name,passwd,db_type等
2、通过sqoop获取原表的schema信息,进行处理,eg: |字段名|类型名|备注|
3、字段类型转换
4、拼接hive的建表语句,且执行语句
5、通过sqoop导入数据,接收参数有时间,原数据库名称,表名,hive的库名称,hive的表名
   5.1) 如果是全量(a)抽取,则抽取所有数据,且保留一个文件
   5.2) 如果是初始化(init),则抽取${modified_dt} <='${ptVal}'  or ${create_dt}<'${ptVal}',保留到 dt=t-1的分区中
   5.3) 如果是增量(i),则抽取(${modified_dt}>='${startDt}' and ${modified_dt}<'${ptVal}')  or (${create_dt}>='${startDt}' and ${create_dt}<'${ptVal}') ,保留到 dt=t-1的分区中
6、如果-t 中i/a/init对应的是增量/全量/初始化

2、stage到dwd和ewd

:<<EOF
功能描述:将stage中的数据通过全量,增量,快照导入dwd和ewd。且进行脱敏和加密
启动方式: dwd      -s     ${stage_hive_name}        -f      ${rule}     -d      ${hivePartition}   -c     ${storagerule}
启动说明:脚本名称   参数      stage中hive的表名       参数      规则        参数        hive的日期      参数     存储策略 a/i/s
脚本步鄹:
1、启动案例   ./dwd  -s  s_yuhui_card_master_a    -f   sm_sec_first_nam:2-0   -d '2019-01-11'  -c s   (规则)
2、规则解析:sm_sec_first_nam:2-0  字段名:清洗规则-脱敏规则
3、createFile        创建stage中表的schema ,eg:  control             	string              	riskparam/风控参数
4、nalysisFields     将规则存储到map集合中
5、combination_sql   数据从stage到dwd和ewd的过程
   5.1)根据存储策略修改存储表名称,修改前缀和后缀
   5.2)创建表dwd或者ewd表,通过传入参数创建dwd表和ewd表,全量不需要日期字段,快照和增量需要日期字段。方法createTable ${database_type}  ${tableName}
   5.3) 创建sql的执行脚本,包括三段分别伟为 ${middle_sql_1}  ${middle_sql_2}  ${foot_sql}
                                       ge: select          字段               from
   5.4)middle_sql_1
       5.4.1)   如果dwd存储策略为快照(s️),stage层表为增量(i),则将所有所有数据临时存储到tmp库中
                如果dwd存储策略为快照(s️),stage层表不为增量(i),则拼接middle_sql_1
       5.4.2)   如果dwd存储策略为全量(a️),stage层表为增量(i),则将所有所有数据临时存储到tmp库中
                如果dwd存储策略为全量(a️),stage层表不为增量(i),则拼接middle_sql_1
       5.4.3)   如果dwd存储策略为增量(i️),stage层表为增量(i),则拼接middle_sql_1
                其他则退出
   5.5)middle_sql_2
       5.5.1)   dwd的字段预处理,通过字段匹配将需要清洗,加密,脱敏的字段进行字段处理。eg:sha2(trim(first_name),256)  as first_name_sha2
       5.5.2)   ewd的字段预处理,通过字段匹配将需要清洗,加密,脱敏的字段进行字段处理。eg:aesenc(trim(first_name))  as first_name_ae
   5.6)foot_sql
       5.6.1)   如果dwd存储策略为快照(s️),stage层表为全量(a),则foot_sql = from stage.stageTableName
                如果dwd存储策略为快照(s️),stage层表为增量(i),则foot_sql = from tmp.${database_type}_${stage_tableName} where rn = 1"
       5.6.2)   如果dwd存储策略为全量(a️),stage层表为全量(a),则foot_sql="  from stage."${stage_tableName}
                如果dwd存储策略为全量(a️),stage层表为全量(i),则foot_sql="  from tmp.${database_type}_${stage_tableName} where rn = 1"
       5.6.3)   如果dwd存储策略为增量(i️),stage层表为增量(i),则foot_sql="  from stage.${stage_tableName} where dt='${parttionDt}'"
                其他则退出
EOF

3、规则解析

#!/usr/bin/env bash

#定义全局map集合
declare -A map=()

#字段规则
encfields=login_value:13-2,first_name:2-0,regis_address:24-0,last_name:2-0

#按照逗号拆分字段规则放入map集合中,字段为key,规则为value
if [ "${encfields}"x != "no"x  ];then
  array=(${encfields//,/ })
  for var in ${array[@]}
  do
  echo "fieldsAndRule===>"${var}
  key=${var%%:*}
    value=${var##*:}
    map[${key}]=${value}
  done
  echo "all valus in map :###################"${map[@]}
fi

#输出所有key
echo "输出所有key==>" ${!map[@]}

#输出所有value
echo "输出所有value==>" ${map[@]}

#遍历map
for key in ${!map[@]}
do
    echo "key值==>【"${key}"】所对应的value==>【"${map[$key]}"】"
done

#清洗函数
wash()
{
   qingxi_num=$1
   field=$2
   for((i=0; i<${#qingxi_num}; i++))
      do
        case ${qingxi_num:i:1} in
          0)
            field=${field}
            ;;
          1)
            field="q_del_all_blank==>"${field}
            ;;
          2)
            field="q_trim==>"${field}
            ;;
          3)
            field="q_del_specil==>"${field}
            ;;
          4)
            field="q_all_upper==>"${field}
            ;;
          5)
            field="q_all_lower==>"${field}
            ;;
        esac
      done
   echo ${field}
}

#清洗规则解析
for key in ${!map[@]}
do
    field=${key}
    array=(${map[$key]//-/ })
    qingxi=${array[0]}
    tm=${array[1]}
    echo "key值==>【"${key}"】qingxi==>"${qingxi}
    echo "key值==>【"${key}"】tm==>"${tm}
    f1=$(wash $qingxi ${field})
    fields+=${f1}",\n"
done

#打印需要清洗的字段
echo  -e "${fields%,*}"


展现结果:

fieldsAndRule===>login_value:13-2

fieldsAndRule===>first_name:2-0

fieldsAndRule===>regis_address:24-0

fieldsAndRule===>last_name:2-0

all valus in map :###################2-0 13-2 24-0 2-0

输出所有key==> last_name login_value regis_address first_name

输出所有value==> 2-0 13-2 24-0 2-0

key值==>【last_name】所对应的value==>【2-0】

key值==>【login_value】所对应的value==>【13-2】

key值==>【regis_address】所对应的value==>【24-0】

key值==>【first_name】所对应的value==>【2-0】

key值==>【last_name】qingxi==>2

key值==>【last_name】tm==>0

key值==>【login_value】qingxi==>13

key值==>【login_value】tm==>2

key值==>【regis_address】qingxi==>24

key值==>【regis_address】tm==>0

key值==>【first_name】qingxi==>2

key值==>【first_name】tm==>0

q_trim==>last_name,

q_del_specil==>q_del_all_blank==>login_value,

q_all_upper==>q_trim==>regis_address,

q_trim==>first_name

猜你喜欢

转载自blog.csdn.net/silentwolfyh/article/details/86502037
今日推荐