背景。我可以计算我的蜂窝分区表的大小,如下所示<即找到所有分区的大小,然后将所需分区的大小相加>
hdfs dfs -du 'hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1'
100 hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1/dt=2021-10-06
200 hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1/dt=2021-10-07
300 hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1/dt=2021-10-08
400 hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1/dt=2021-10-09
500 hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1/dt=2021-10-10
600 hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1/dt=2021-10-11
我想找出特定分区之间的表的大小<即dt>=2021-10-09>
即,dt=2021-10-09到dt=20211-10-11分区之间的test.tbl1的大小为=400+500+600=1500字节
有没有办法在dfs-du阶段过滤掉结果以避免手动求和?
使用POSIX awk(例如GNU或BSD awk),您可以使用gsub
函数预处理每行的最后一个字段($NF
),以仅保留日期。然后,当且仅当最后一个字段($NF
)在定义的范围内时,您可以计算第一个字段的和($1
)。dt >= 2021-10-09
:示例
$ hdfs dfs -du 'hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1' |
awk -v dtmin='2021-10-09' '
{gsub(/.*=/,"",$NF)} $NF>=dtmin{sum+=$1} END{print sum}'
1500
对于封闭范围:
$ hdfs dfs -du 'hdfs://localhost:9090/user/temp/warehouse/test.db/tbl1' |
awk -v dtmin='2021-10-06' -v dtmax='2021-10-08' '
{gsub(/.*=/,"",$NF)} $NF>=dtmin && $NF<=dtmax{sum+=$1} END{print sum}'
600