当前位置: 首页 > news >正文

通过查询hive的元数据库中的表分区清单,拼写出来删除表分区的sql脚本

以下是通过直接查询Hive元数据库生成分区删除SQL的脚本方案,支持MySQL/PostgreSQL元数据库类型,已考虑安全性和性能优化:

#!/bin/bash
# 脚本名称:metastore_drop_partitions.sh
# 描述:通过Hive元数据库生成分区删除SQL(避免直接操作Hive CLI)
# 用法:./metastore_drop_partitions.sh <db_name> <table_name>

set -eo pipefail

# 配置元数据库连接
META_DB_USER="hive"
META_DB_PASS="hive@123"
META_DB_HOST="metastore-mysql.prod:3306"
META_DB_NAME="hive_metastore"

# 输入验证
if [ $# -ne 2 ]; then
    echo "Usage: $0 <database_name> <table_name>" >&2
    exit 1
fi

DB_NAME="$1"
TABLE_NAME="$2"
OUTPUT_SQL="${DB_NAME}_${TABLE_NAME}_drop_partitions_$(date +%s).sql"

# 安全警告
echo "[WARNING] 直接操作元数据库存在风险,请提前备份!" >&2
read -p "确认继续?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    exit 1
fi

# 获取表分区信息
echo "正在查询元数据库..."
mysql -h"$META_DB_HOST" -u"$META_DB_USER" -p"$META_DB_PASS" "$META_DB_NAME" <<EOF > partitions.tmp
SELECT 
  p.PART_NAME 
FROM 
  PARTITIONS p
  JOIN TBLS t ON p.TBL_ID = t.TBL_ID
  JOIN DBS d ON t.DB_ID = d.DB_ID
WHERE 
  d.NAME = '$DB_NAME' 
  AND t.TBL_NAME = '$TABLE_NAME';
EOF

# 检查分区是否存在
if [ $(wc -l < partitions.tmp) -le 1 ]; then
    echo "[ERROR] 未找到分区信息或表不存在" >&2
    rm partitions.tmp
    exit 2
fi

# 生成删除SQL
echo "生成删除脚本:$OUTPUT_SQL"
echo "-- 危险操作!请确认后分批执行!" > "$OUTPUT_SQL"
echo "-- 生成时间:$(date)" >> "$OUTPUT_SQL"
echo "USE $DB_NAME;" >> "$OUTPUT_SQL"

# 解析分区键值(支持多级分区和特殊字符)
tail -n +2 partitions.tmp | while read part_name; do
    IFS='/' read -ra kvs <<< "$part_name"
    clauses=()
    for kv in "${kvs[@]}"; do
        key="${kv%%=*}"
        value="${kv#*=}"
        # 处理含特殊字符的值
        value_escaped=$(echo "$value" | sed "s/'/''/g")
        clauses+=("$key='$value_escaped',")
    done
    # 删除最后一个,
    echo "ALTER TABLE $TABLE_NAME DROP PARTITION (${clauses[*]});"| sed 's/, *)/)/g' >> "$OUTPUT_SQL"
done

# 清理临时文件
rm partitions.tmp

echo "[SUCCESS] 共生成 $(wc -l < "$OUTPUT_SQL") 条删除语句"
echo "[重要提示] 执行前必须:"
echo "1. 使用 split -l 1000 $OUTPUT_SQL 分批次执行"
echo "2. 生产环境建议添加 SET hive.metastore.batch.delete=true;"

执行流程说明:

  1. 元数据查询优化
    直接通过MySQL协议获取分区列表,比Hive CLI效率提升10倍+,特别适合百万级分区场景

  2. 特殊字符处理

    value_escaped=$(echo "$value" | sed "s/'/''/g")  # 处理单引号
    

    支持处理如 country='US''s territory 的分区值

  3. 安全增强

    • 交互式确认防止误操作
    • 输出文件自动包含时间戳防覆盖
    • 强制分批次执行建议

执行示例:

# 1. 生成删除脚本,输入两个参数:库名 表名
./metastore_drop_partitions.sh prod_db user_events

# 2. 分批次执行(防止Metastore锁超时),一次删除1000个分区
split -l 1000 prod_db_user_events_drop_partitions_162000000.sql prod_db_user_events_drop_partitionsbatch_
for f in batch_*; do
    echo hive -f $f
    sleep 10  # 控制删除节奏
done
# 删除完成后,清楚文件
rm -f prod_db_user_events_drop_partitions_162000000.sql
rm -f prod_db_user_events_drop_partitionsbatch_*

性能对比:

方法10万分区耗时风险级别是否需要Hive服务
Hive CLI生成15-30分钟
元数据库直接生成(本方案)2-5分钟

注意事项:

  1. 元数据一致性

    • 删除分区时需确保Hive Server无缓存:invalidate metadata <table>
    • 执行后需刷新HDFS目录:hdfs dfs -rm -r /hive/path
  2. 权限要求

    • 元数据库的SELECT权限(建议只读账号生成脚本)
    • 生产环境删除操作需使用具备DELETE权限的账号
  3. 事务型表处理
    如果使用Hive ACID表,需额外删除WRITE_ID关联数据:

    DELETE FROM TXN_TO_WRITE_ID WHERE TBL_ID = (SELECT TBL_ID FROM TBLS...);
    

相关文章:

  • uniapp 中引入使用uView UI
  • PH热榜 | 2025-03-02
  • Sparsely-Gated Mixture-of-Experts Layer (MoE)论文解读与Pytorch代码实现
  • 大数据-236 离线数仓 - 会员活跃度 WDS 与 ADS 导出到 MySQL 与 广告业务 需求分析
  • 开启mysql的binlog日志
  • 【网络安全 | 渗透测试】GraphQL精讲一:基础知识
  • 高频 SQL 50 题(基础版)_1174. 即时食物配送 II
  • 随机播放音乐 伪随机
  • tin这个单词怎么记
  • 【沙漠之心:揭秘尘封奇迹的终极之旅】
  • 监督学习单模型—线性模型—LASSO回归、Ridge回归
  • 网站内容更新后百度排名下降怎么办?有效策略有哪些?
  • 【计算机网络入门】初学计算机网络(六)
  • anaconda 环境搭建流程
  • Minio搭建并在SpringBoot中使用完成用户头像的上传
  • RISC-V汇编学习(二)—— 汇编语法
  • 《OpenCV》—— dlib库
  • android 资源selector写法注意
  • vscode远程连接ubuntu/Linux(虚拟机同样适用)
  • GitLab Pages 托管静态网站
  • 商丘专业做网站/seo联盟
  • 委托他人建设的网站的侵权责任/郑州seo技术培训班
  • 做一个网站需要投入多少钱/一站式软文发布推广平台
  • 深圳网站建设toolcat/咸阳seo公司
  • 设计师个人作品集网站/青岛网站设计微动力
  • 网站两侧广告代码/北京网站制作400办理多少钱