Hive表分区删除:如何删除早于24个月的val_dt分区?
问题分析与正确解决方案
首先,咱们先搞清楚你之前的命令为什么会误删所有分区:
- 错误的类型转换:你在HiveQL里用了
date "${hivevar:var_drop_date}",但var_drop_date本身已经是YYYY-MM格式的字符串了。Hive在把字符串类型的分区列val_dt和date()转换后的日期类型做比较时,会触发隐式类型转换,这个转换逻辑导致所有分区都被判定为满足<=条件,最终全部被删除。 - 冗余的函数调用:
YYYY-MM格式的字符串本身的字典序和时间顺序是完全一致的(比如2018-05>2017-12),根本不需要用date()函数转换,直接做字符串比较就可以准确筛选出时间范围。
正确的删除命令
你只需要去掉多余的date()函数,并且把条件改成<(因为要保留最近24个月的分区,早于24个月的才删除,比如2020-05的24个月前是2018-05,那么val_dt < '2018-05'的分区都要删掉):
beeline --hivevar var_drop_date="$(date -d "24 months ago" '+%Y-%m')" -e 'ALTER TABLE consumer_data DROP IF EXISTS PARTITION(val_dt < "${hivevar:var_drop_date}")'
安全验证小技巧
为了避免再次误删,建议先执行查询确认要删除的分区:
SHOW PARTITIONS consumer_data WHERE val_dt < "${hivevar:var_drop_date}";
确认结果符合预期后,再执行ALTER TABLE DROP PARTITION命令,这样更稳妥。
内容的提问来源于stack exchange,提问作者Ajay




