版权声明:本文为博主原创文章,出处为 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