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


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

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

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

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

    1. #!/bin/bash
    2. # 2024.04.19
    3. read -p "请按示例格式输入要脱敏的hive表、分区,示例: test_db.table_name 20240331 ### " table etl_date
    4. #获取库名、表名,存入变量
    5. dbname=`echo $table |awk -F. '{print $1}'`
    6. tbl=`echo $table |awk -F. '{print $2}'`
    7. target_db=import_db
    8. #首先判断目标表是否存在
    9. hdfs dfs -test -e /user/hive/warehouse/${target_db}.db/$tbl
    10. if [ $? -eq 0 ] ;then
    11. echo "${target_db}.$tbl 目标库已经存在...,请确认表结构是否与源表一致"
    12. else
    13. # 1、 在 ${target_db} like 建表
    14. echo "1、 create table ${target_db}.$tbl like $table;"
    15. beeline -e "create table ${target_db}.$tbl like $table;"
    16. # 2、 把hive表,所有字段 切出来 备用
    17. beeline --showHeader=false --outputformat=tsv2 -e "desc $table" |awk '{print $1}' >desc_field.out
    18. echo "desc $table .... beeline ok"
    19. #############################################md5表字段加密开始#############################################
    20. num=`cat desc_field.out |grep NULL |wc -l`
    21. if [ $num == 1 ] ;then
    22. # tac desc_field.out |sed -n '6,$p' |tac >desc_field_final.out
    23. cat desc_field.out |sed '/NULL/,$d' >desc_field_final.out
    24. else
    25. cat desc_field.out >desc_field_final.out
    26. fi
    27. # 需要脱敏的敏感字段,手动添加维护
    28. sensitive_fields=('name' 'phone' 'iden' 'tel')
    29. fields=`cat desc_field_final.out`
    30. m=`cat desc_field_final.out |wc -l`
    31. flag=0
    32. md5_fields=""
    33. echo $md5_fields
    34. # 嵌套循环,拿 表字段 与 敏感字段 进行匹配,表字段如果是敏感字段,进行MD5 加密,拼接 sql 字符串
    35. for j in $fields
    36. do
    37. biaoji=1
    38. # 1.匹配到,进行md5加密,拼接;标记置为0,跳出内循环;2.没有匹配到,继续下一轮内循环;
    39. length=${#sensitive_fields[*]}
    40. # length 控制内循环的次数
    41. for ((i=0;i<${length};i++))
    42. do
    43. echo "i=$i"
    44. if [ $j == ${sensitive_fields[i]} ]
    45. then
    46. md5_fields=${md5_fields}",md5($j) as $j"
    47. biaoji=0
    48. break
    49. else
    50. continue
    51. fi
    52. done
    53. # 内循环执行一轮结束,对 biaoji 的值进行判断,为1,说明 表字段 非敏感字段,进行拼接
    54. if [ $biaoji == 1 ]
    55. then
    56. md5_fields=${md5_fields}","$j
    57. fi
    58. echo $md5_fields
    59. ((flag++))
    60. echo "flag=$flag"
    61. # 外循环次数 等于 表字段数,外循环完成,拼接 md5_fields 完成
    62. if [ $flag -eq $m ]
    63. then
    64. # 删除 md5_fields 串里第一个逗号,正确的 md5_fields 拼接完成
    65. md5_fields=`echo $md5_fields | sed 's/,//'`
    66. echo $md5_fields
    67. fi
    68. done
    69. #############################################md5表字段加密结束#############################################
    70. #############分区###############
    71. in_values="'$etl_date'"
    72. echo "in_values=$in_values"
    73. # in_values=""
    74. # for i in 20240131,20240228,20240331
    75. # do
    76. # in_values=$in_values",'$j'"
    77. # done
    78. # # ,'20240131','20240228','20240331'
    79. # in_values=`echo $in_values |sed 's/,//'`
    80. # # '20240131','20240228','20240331'
    81. # echo "in_values=$in_values"
    82. ###############分区###############
    83. # 3、对分区字段个数计数 如果是分区表,取出分区字段
    84. partition_field_num= `sed -n '/#/,$p' desc_field.out |grep ^[^#] |wc -l`
    85. echo "partition_field_num=$partition_field_num"
    86. sql="insert overwrite table $target_db.$tbl "
    87. echo "初始:$sql"
    88. # 4、生成更新分区数据的语句;分区字段个数不同,生成不同的 insert overwrite table
    89. if [ $partition_field_num -eq 2 ];then
    90. partition1=$(echo `sed -n '/#/,$p' desc_field.out |grep ^[^#]` |awk '{print $1}')
    91. partition2=$(echo `sed -n '/#/,$p' desc_field.out |grep ^[^#]` |awk '{print $2}')
    92. sql=$sql"partition($partition1,$partition2) select $md5_fields from $table where $partition1 in ($in_values);"
    93. echo "拼接2个分区后:$sql"
    94. elif [ $partition_field_num -eq 1 ];then
    95. partition1=$(echo `sed -n '/#/,$p' desc_field.out |grep ^[^#]` |awk '{print $1}')
    96. sql=$sql"partition($partition1) select $md5_fields from $table where $partition1 in ($in_values);"
    97. echo "拼接1个分区后:$sql"
    98. else
    99. sql=$sql"select $md5_fields from $table;"
    100. echo "无分区:$sql"
    101. fi
    102. # 5、生成 update_partitions.sql
    103. cat <<-'EOF' >update_partitions.sql
    104. set hive.execution.engine=tez;
    105. set tez.queue.name=root.default;
    106. set hive.tez.java.opts=-Xmx6144m;
    107. set hive.tez.container.size=8192;
    108. set hive.exec.dynamic.partition=true;
    109. set hive.exec.dynamic.partition.mode=nonstrict;
    110. set hive.exec.dynamic.partitions.pernode=1000;
    111. EOF
    112. echo "$sql" >>update_partitions.sql
    113. fi

  • 相关阅读:
    怎么给字符串字段加索引?
    现代架构设计:构建可伸缩、高性能的分布式系统
    (2) Java 8 实战第二版——补充 收集数据、并行数据处理能力与性能
    需求分析步骤
    AT89S51编辑和烧录软件过程
    Python Web:Django、Flask和FastAPI框架对比
    编程2016 1
    dubbo admin 无法启动提示:zookeeper not connected 解决方案
    免实名域名是什么意思?
    2000-2023年省市县人工智能企业数量数据
  • 原文地址:https://blog.csdn.net/weixin_46028840/article/details/138084725