目的:获取hive中所有表的创建时间和表大小
本文给出了一个既可以统计hive中非分区表也可以统计分区表的表大小的方式。 由于业务上没有针对分区数据统计的需求,所以可以使用此种方式统计。 如果业务需要统计分区数据,这种方式就不合适了。
1、获取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 "\n\n"
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_FORMAT\t$TABLE_NAME" >> all_tables_name_createTimeFormat.txt
done <all_tables_name_createTime.txt
源文件: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_10
4、获得表的创建时间和大小
脚本名称: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 "$TIME\t$TABLE_NAME\tTABLE_SIZE\tHDFS_PATH" >> $RESOUT_FILE
else
echo -e "$TIME\t$TABLE_NAME\t$TABLE_SIZE\t$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列的数据表,便于数据统计
|