如何基于指定分区过滤条件计算Hive分区表的存储大小
解决方案
完全可以在hdfs dfs -du执行阶段通过管道结合文本处理命令直接完成过滤和求和,无需后续手动计算,你需要的场景可以直接用以下命令实现:
# 筛选dt >= 2021-10-09的分区并计算总大小 hdfs dfs -du 'hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1' | awk -v target_dt='2021-10-09' ' { # 拆分分区路径提取dt的取值 split($2, path_parts, "=") dt_val = path_parts[length(path_parts)] # 符合筛选条件则累加大小 if (dt_val >= target_dt) { total += $1 } } END { print "符合条件的分区总大小:" total " Bytes" }'
逻辑说明
- 命令首先通过
hdfs dfs -du获取表下所有分区的大小和路径,结果直接通过管道传递给awk处理,不需要存储中间结果 - 由于dt分区使用
yyyy-MM-dd格式,字符串排序和日期排序规则完全一致,直接比较字符串即可实现日期范围筛选,无需额外转换格式 - 所有过滤、求和操作都在本地节点完成,不会额外增加HDFS集群的负载
扩展用法
如果需要更复杂的筛选规则,直接修改awk中的判断条件即可:
- 筛选dt在
2021-10-07到2021-10-10区间:if (dt_val >= "2021-10-07" && dt_val <= "2021-10-10") - 多分区筛选,比如同时要求dt >= 2021-10-09且country=CN:可以拆分路径提取多个分区值再叠加判断条件
内容的提问来源于stack exchange,提问作者axnet
相关产品推荐
相关产品推荐

