shell - Hive ALTER 命令删除值超过 24 个月的分区
问题描述
我有一个带有分区列 'val_dt'的配置单元表(consumer_data),这是一个字符串列,其值的日期格式 为 'yyyy-MM'。
我在表中有多个分区,从“2015-01”到“2020-04”。每个月都会将数据增量添加到表中,因此添加的下一个分区将是“2020-05”。
我想删除超过 24 个月的分区。此分区删除每月执行一次,仅保留最近 24 个月的数据。
如何构建 ALTER 命令以删除值超过 24 个月的分区。
我通过 linux shell 使用示例数据运行了以下直线查询,但它删除了所有分区。
beeline --hivevar var_drop_date="$(date -d "24 months ago" '+%Y-%m')" -e 'ALTER TABLE consumer_data DROP IF EXISTS PARTITION(val_dt <= date "${hivevar:var_drop_date}")'
Partition present before running the query:
val_dt=2016-01
val_dt=2017-01
val_dt=2019-01
val_dt=2020-01
Partitions present after running the query:
None
Required output:
val_dt=2019-01
val_dt=2020-01
解决方案
hivevar
使用选项时不需要-e
,变量可以直接替换。date
此外,如果分区是格式化的,则不需要分区规范中的附加功能yyyy-MM
,您可以仅使用 shell 以所需格式计算日期。也'yyyy-MM'
应该用引号引起来,因为分区是字符串,如下所示:val_dt<='2018-05'
试试这个:
beeline -e "ALTER TABLE consumer_data DROP IF EXISTS PARTITION(val_dt <= '$(date -d "24 months ago" '+%Y-%m')')"
推荐阅读
- java - 尝试制作自动类型的数组时出错
- c++ - QFile::copy 是否将源文件权限保留在复制的文件中?
- java - Kotlin 错误:“public”函数暴露了它的“public/*package*/”返回类型参数
- mocha.js - 测试混合的基于异步/承诺的代码和基于回调的代码
- codeigniter - 如何将设置规则中的多个参数发送到codeIgniter中的公共函数
- sql - 如何在 SQL 表的开头添加行号列?
- javascript - 获取在 ajax 函数之后动态加载的正确表单 id 格式
- php - 获取数据后创建文件'php'
- javascript - 有换行符时切断文本
- c - C - 存储偶数直到输入结束