本文给出了一个既可以统计hive中非分区表也可以统计分区表的表大小的方式。
由于业务上没有针对分区数据统计的需求,所以可以使用此种方式统计。
如果业务需要统计分区数据,这种方式就不合适了。
在hive的元数据存储数据库中执行(当前为mysql):
SELECt CREATE_TIME,TBL_NAME FROM TBLS ;
结果文件存储在:all_tables_name_createTime.txt(内容见第3点)
2、获取当前hdfs中hive库表存储路径和大小hive_data_size_count.sh
#!/bin/env bash
HIVE_WAREHOUSE=/user/hive/warehouse
ALL_DATAbaseS=(`hdfs dfs -ls ${HIVE_WAREHOUSE} | awk '{print $8}'`)
for i in ${!ALL_DATAbaseS[@]}
do
echo "当前库${ALL_DATAbaseS[i]}的大小:"
hdfs dfs -du -h ${HIVE_WAREHOUSE} | grep ${ALL_DATAbaseS[i]}
echo "当前库内表的大小"
hdfs dfs -du -h ${ALL_DATAbaseS[i]}
echo -e "nn"
done
结果文件存储在:hive_data_count6(文件内容见第4点)
3、将1中获取的hive创建时间转换为易读性好的格式脚本名称:changeTimeFormat.sh
将有两列字段——hive表创建的时间(时间戳形式)、hive表名——的文件中,时间戳修改为阅读友好型的年月日时分秒形式。
#!/bin/env bash
while read line
do
echo $line
TIMESTAMP=`echo $line | awk '{print $1}'`
TABLE_NAME=`echo $line | awk '{print $2}'`
if [[ $TIMESTAMP -ne "CREATE_TIME" ]];then
# 格式为:年月日|时分秒,之所以使用|作为间隔符,是因为文件是以t制表符作为间隔,防止空格和制表符在使用echo命令时候无法将时间以整个字段进行分隔
TIME_FORMAT=`date -d @$TIMESTAMP "+%Y-%m-%d|%H:%M:%S"`
else
TIME_FORMAT="CREATE_TIME"
fi
echo -e "$TIME_FORMATt$TABLE_NAME" >> all_tables_name_createTimeFormat.txt
done
源文件:all_tables_name_createTime.txt文件示例(间隔符是t,制表符)
CREATE_TIME TBL_NAME 1618910542 yjj_bzy 1619074492 ods_yjj_bzy 1619075278 stg_yjj_bzy 1620637222 wxm_ods_test_2021_5_10
结果文件:all_tables_name_createTimeFormat.txt (间隔符是t,制表符)
CREATE_TIME TBL_NAME 2021-04-20|17:22:22 yjj_bzy 2021-04-22|14:54:52 ods_yjj_bzy 2021-04-22|15:07:58 stg_yjj_bzy 2021-05-10|17:00:22 wxm_ods_test_2021_5_104、获得表的创建时间和大小
脚本名称:combineNameTimeSize.sh
脚本目的是从hdfs的/user/hive/warehouse目录中得到的表内容中获取hive元数据中实际存在的hive表的大小和创建时间
#!/bin/env bash
# bei pipei de wenjian
SOURCE_FILE=all_tables_name_createTimeFormat.txt
FILTER_FILE="hive_data_count6"
RESOUT_FILE=hive_table_name_size_time.txt
while read line
do
TIME=`echo $line | awk '{print $1}'`
TABLE_NAME=`echo $line | awk '{print $2}'`
HIVE_TABLE_SIZE_PATH=`cat $FILTER_FILE | grep $TABLE_NAME`
TABLE_SIZE=`echo $HIVE_TABLE_SIZE_PATH | awk '{print $1}'`
HDFS_PATH=`echo $HIVE_TABLE_SIZE_PATH | awk '{print $2}'`
if [[ "$TIME" -eq "CREATE_TIME" ]];then
echo -e "$TIMEt$TABLE_NAMEtTABLE_SIZEtHDFS_PATH" >> $RESOUT_FILE
else
echo -e "$TIMEt$TABLE_NAMEt$TABLE_SIZEt$HDFS_PATH" >> $RESOUT_FILE
fi
done < $SOURCE_FILE
被过滤的hdfs数据文件:hive_data_count6
(数据获取方式:hdfs dfs -du -h /user/hive/warehouse)
37.1K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_gc_info_i_y 12.7K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_hw_gdccrb_i_d 7.6K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_hw_gdfsfdcrb_i_d 4.2K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_hw_xlljjsczrb_i_d 5.7K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_hw_xlslyczqkrb_i_d 12.9K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_hw_yjswclzxclrb_a_d 10.7K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_js_ssljflxqinfo_i_d 2.7K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_js_vehicleinfo_i_m 1.8M /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_sr_store_i_d 13.9K /user/hive/warehouse/dwd_cgj.db/cgj_ods_s_csglj_zxc_station_a_d
结果数据:hive_table_name_size_time.txt
CREATE_TIME TBL_NAME TABLE_SIZE HDFS_PATH 2021-04-20|17:22:22 yjj_bzy 27.1K /user/hive/warehouse/ods.db/ods_yjj_bzy 2021-04-22|14:54:52 ods_yjj_bzy 27.1K /user/hive/warehouse/ods.db/ods_yjj_bzy 2021-04-22|15:07:58 stg_yjj_bzy 636.7K /user/hive/warehouse/stg.db/stg_yjj_bzy 2021-05-10|17:00:22 wxm_ods_test_2021_5_10 117.1K /user/hive/warehouse/test_hive2.db/wxm_ods_test_2021_5_10 2021-05-10|11:11:53 t_czfwjcxxb_wxm 1.1M /user/hive/warehouse/ods_zfw.db/t_czfwjcxxb_wxm
5、将hive_table_name_size_time.txt文件的内容拷贝到excel表格中,即可形成4列的数据表,便于数据统计



