shell 实现对Hive表脱敏建视图

需求描述:在Hive中,对 input_db 库中的表在 export_db 建视图,对表中的 姓名、手机号、身份证号等字段进行 MD5 加密脱敏

#!/bin/bash
read -p "请按示例格式输入要脱敏的Hive表,示例: db_name.table_name ### " table

tbl=`echo $table |awk -F. '{print $2}'`

beeline --showHeader=false --outputformat=tsv2 -e "desc $table" |awk '{print $1}' >desc_field.out

num=`cat desc_field.out |grep NULL |wc -l`
if [ $num == 1 ] ;then
	echo "分区表"
	cat desc_field.out |sed '/NULL/,$d' >desc_field_final.out
	# tac desc_field.out |sed -n '6,$p' |tac >desc_field_final.out
else
	echo "非分区表"
	cat desc_field.out >desc_field_final.out
fi

# 需要脱敏的敏感字段,手动添加维护
sensitive_fields=('name' 'phone' 'iden' 'tel')

fields=`cat desc_field_final.out`
m=`cat desc_field_final.out |wc -l`
flag=0

sql="create view export_db.${tbl}_view as select "
echo $sql

# 嵌套循环,拿 表字段 与 敏感字段 进行匹配,表字段如果是敏感字段,进行MD5 加密,拼接 sql 字符串
for j in $fields
do
	biaoji=1
	# 1.匹配到,进行md5加密,拼接;标记置为0,跳出内循环;2.没有匹配到,继续下一轮循环;
	length=${#sensitive_fields[*]}
	# length 控制内循环的次数
	for ((i=0;i<${length};i++))
	do
		echo "i=$i"
		if [ $j == ${sensitive_fields[i]} ]
		then
			sql=${sql}",md5($j) as $j"
			biaoji=0
			break
		else
			continue
		fi
	done
	
	# 内循环执行一轮结束,对 biaoji 的值进行判断,为1,说明 表字段 非敏感字段,进行拼接
	if [ $biaoji == 1 ]
	then
		sql=${sql}","$j
	fi
	echo $sql
	
	((flag++))
	echo "flag=$flag"
	# 外循环次数 等于 表字段数,外循环完成,拼接 sql 的末尾部分
	if [ $flag -eq $m ]
	then
		sql=${sql}" from "$table";"
		# 删除 sql 串里第一个逗号,正确的 sql 拼接完成
		sql=`echo $sql | sed 's/,//'`
		echo $sql
	fi
	
done

# beeline 执行建视图
beeline -e "${sql}"

你可能感兴趣的:(Linux,bigdata,hive,hadoop,数据仓库)