shell 实现对Hive表字段脱敏写入新表

news/2024/10/21 15:32:17/

数据安全管理,本shell 实现对hive源表敏感字段进行md5加密,然后写入新表;

read -p 交互输入:要脱敏的hive表、分区,示例: test_db.table_name 20240331

生成更新hive分区表的hql: insert overwrite table xxx

备注:仅供参考,可对本shell代码,做进一步修改调整,满足自己的需求。

#!/bin/bash
# 2024.04.19
read -p "请按示例格式输入要脱敏的hive表、分区,示例: test_db.table_name 20240331 ### " table etl_date#获取库名、表名,存入变量
dbname=`echo $table |awk -F. '{print $1}'`
tbl=`echo $table |awk -F. '{print $2}'`target_db=import_db#首先判断目标表是否存在
hdfs dfs -test -e /user/hive/warehouse/${target_db}.db/$tbl
if [ $? -eq 0 ] ;thenecho "${target_db}.$tbl 目标库已经存在...,请确认表结构是否与源表一致"else# 1、 在 ${target_db} like 建表
echo "1、 create table ${target_db}.$tbl like $table;"
beeline -e "create table ${target_db}.$tbl like $table;"# 2、 把hive表,所有字段 切出来 备用
beeline --showHeader=false --outputformat=tsv2 -e "desc $table" |awk '{print $1}' >desc_field.out
echo "desc $table .... beeline ok"#############################################md5表字段加密开始#############################################
num=`cat desc_field.out |grep NULL |wc -l`
if [ $num == 1 ] ;then# tac desc_field.out |sed -n '6,$p' |tac >desc_field_final.outcat desc_field.out |sed '/NULL/,$d' >desc_field_final.out
elsecat 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=0md5_fields=""
echo $md5_fields
# 嵌套循环,拿 表字段 与 敏感字段 进行匹配,表字段如果是敏感字段,进行MD5 加密,拼接 sql 字符串
for j in $fields
dobiaoji=1# 1.匹配到,进行md5加密,拼接;标记置为0,跳出内循环;2.没有匹配到,继续下一轮内循环;length=${#sensitive_fields[*]}# length 控制内循环的次数for ((i=0;i<${length};i++))doecho "i=$i"if [ $j == ${sensitive_fields[i]} ]thenmd5_fields=${md5_fields}",md5($j) as $j"biaoji=0breakelsecontinuefidone# 内循环执行一轮结束,对 biaoji 的值进行判断,为1,说明 表字段 非敏感字段,进行拼接if [ $biaoji == 1 ]thenmd5_fields=${md5_fields}","$jfiecho $md5_fields((flag++))echo "flag=$flag"# 外循环次数 等于 表字段数,外循环完成,拼接 md5_fields 完成if [ $flag -eq $m ]then# 删除 md5_fields 串里第一个逗号,正确的 md5_fields 拼接完成md5_fields=`echo $md5_fields | sed 's/,//'`echo $md5_fieldsfidone
#############################################md5表字段加密结束##########################################################分区###############
in_values="'$etl_date'"
echo "in_values=$in_values"# in_values=""
# for i in 20240131,20240228,20240331
# do
#     in_values=$in_values",'$j'"
# done
# # ,'20240131','20240228','20240331'
# in_values=`echo $in_values |sed 's/,//'`
# # '20240131','20240228','20240331'
# echo "in_values=$in_values"
###############分区################ 3、对分区字段个数计数 如果是分区表,取出分区字段
partition_field_num= `sed -n '/#/,$p' desc_field.out |grep ^[^#] |wc -l`
echo "partition_field_num=$partition_field_num"sql="insert overwrite table $target_db.$tbl "
echo "初始:$sql"# 4、生成更新分区数据的语句;分区字段个数不同,生成不同的 insert overwrite table
if [ $partition_field_num -eq 2 ];thenpartition1=$(echo `sed -n '/#/,$p' desc_field.out |grep ^[^#]` |awk '{print $1}')partition2=$(echo `sed -n '/#/,$p' desc_field.out |grep ^[^#]` |awk '{print $2}')sql=$sql"partition($partition1,$partition2) select $md5_fields from $table where $partition1 in ($in_values);"echo "拼接2个分区后:$sql"elif [ $partition_field_num -eq 1 ];thenpartition1=$(echo `sed -n '/#/,$p' desc_field.out |grep ^[^#]` |awk '{print $1}')sql=$sql"partition($partition1) select $md5_fields from $table where $partition1 in ($in_values);"echo "拼接1个分区后:$sql"elsesql=$sql"select $md5_fields from $table;"echo "无分区:$sql"fi# 5、生成 update_partitions.sql
cat <<-'EOF' >update_partitions.sql
set hive.execution.engine=tez;
set tez.queue.name=root.default;
set hive.tez.java.opts=-Xmx6144m;
set hive.tez.container.size=8192;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partitions.pernode=1000;
EOF
echo "$sql" >>update_partitions.sqlfi


http://www.ppmy.cn/news/1442606.html

相关文章

05_c/c++开源库 spdlog日志库

1.简介与安装 spdlog 是一个用于 C 的高性能、易用的日志库。它提供了丰富的日志功能&#xff0c;包括多种日志级别、格式化输出、异步日志、自定义日志接收器等。spdlog 是一个轻量级的库&#xff0c;性能优越&#xff0c;非常适合用于需要高性能日志记录的场景。 特点 高性…

【FPGA】优化设计指南(一):设计原则

目录 避免采用不可综合的语句设计时采用同步的时钟组合逻辑与毛刺异步复位与同步复位动态分析与静态分析功能流水线时序违例乒乓操作面积和速度的平衡避免采用不可综合的语句 1.#1000延时语句 2.除法运算/,除非除数为2的整次幂 3.实数类型不可综合(real) 4.综上,使用可综合…

史上最详细的FL Studio 21.2.3.4004中文版下载安装激活图文教程以及中文language(附Patch补丁)

还有几天就五一黄金周了&#xff0c;心想着趁还没放假给大家安利一波FL Studio21.2.3 Build 4004激活教程&#xff0c;快来看看把。 FL Studio 21官方版是一款备受用户喜欢的音频编辑器&#xff0c;它功能非常强大&#xff0c;支持用户在线编辑&#xff0c;简单直观的操作界面&…

脚本:监控Oracle中正在运行的SQL

这是我自己平时用的一个监控Oracle中正在运行的SQL的脚本&#xff0c;有需要的请收藏&#xff0c;运行时直接复制和粘贴即可。 col inst_sid heading "INST_ID|:SID" format a7 col username format a10 col machine format a12 col sql_exec_start heading "…

Github 2024-04-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目3HTML项目1CSS项目1C++项目1Rust项目1Jupyter Notebook项目1Vue项目1Code Llama: 大型代码语言模型 创建周期:241 天…

Git for Windows 下载与安装

当前环境&#xff1a;Windows 8.1 x64 1 打开网站 https://git-scm.com/ &#xff0c;点击 Downloads 。 2 点击 Windows 。 3 选择合适的版本&#xff0c;这里选择了 32-bit Git for Windows Portable。 4 解压下载后的 PortableGit-2.44.0-32-bit.7z.exe &#xff0c;并将 P…

OceanBase 分布式数据库【信创/国产化】- 登录 OceanBase 租户

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- 登录 OceanBase 租户前言OceanBase 数据更新架构OceanBase 租户架构登录系统租户通过 MySQL 客户端登录通过 OBClient 登录登录最佳实践登录用户租户登录 Meta 租户OceanBase 分布式数据库【信创/国产化…

【车载开发系列】UDS诊断时间参数说明

【车载开发系列】UDS诊断时间参数说明 一. 应用层诊断时间参数 1&#xff09;P2 CAN_Client 诊断仪成功发送诊断报文请求之后到收到 ECU回复诊断响应的超时时间间隔 2&#xff09;P2 CAN_Server ECU 接收到诊断请求之后到开始发送诊断报文的时间间隔&#xff0c;一般默认最…