You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Hive表分区删除:如何删除早于24个月的val_dt分区?

问题分析与正确解决方案

首先,咱们先搞清楚你之前的命令为什么会误删所有分区:

  1. 错误的类型转换:你在HiveQL里用了date "${hivevar:var_drop_date}",但var_drop_date本身已经是YYYY-MM格式的字符串了。Hive在把字符串类型的分区列val_dtdate()转换后的日期类型做比较时,会触发隐式类型转换,这个转换逻辑导致所有分区都被判定为满足<=条件,最终全部被删除。
  2. 冗余的函数调用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

火山引擎 最新活动