一、目的
在用脚本去实现对HDFS中过期的ODS层原始数据进行删除后,发现还需要在脚本中对HDFS文件是否存在进行判断,否则如果HDFS文件不存在那么任务执行就会报错
报错原因是这一天的HDFS文件并不存在
原有脚本
#! /bin/bash
source /etc/profile
nowdate=`date --date='0 days ago' "+%Y%m%d"`
day_30_ago_date=`date -d "30 day ago " +%Y-%m-%d`
hdfs dfs -rm -r /user/hive/warehouse/hurys_dc_ods.db/ods_event/day=${day_30_ago_date}
二、判断Linux中文件是否存在的shell命令(未亲测过)
if [ ! -f "$file" ];then
echo "文件不存在"
fi
三、Hadoop相关的文件命令
hadoop fs -test
-d 判断<path>是否是目录
-e 判断<path>是否存在
-f 判断<path>是否是个文件
-s 判断内容是否大于0bytes ,大于0为真
-z 判断内容是否等于0bytes,为0真
四、shell脚本判断HDFS文件是否存在,如果存在则删除
新脚本
#! /bin/bash
source /etc/profile
nowdate=`date --date='0 days ago' "+%Y%m%d"`
day_30_ago_date=`date -d "30 day ago " +%Y-%m-%d`
hadoop fs -test -e /user/hive/warehouse/hurys_dc_ods.db/ods_event/day=${day_30_ago_date}
if [ $? -ne 0 ]; then
echo "文件不存在"
else
hdfs dfs -rm -r /user/hive/warehouse/hurys_dc_ods.db/ods_event/day=${day_30_ago_date}
fi
注意:
1、今天是2024年3月5日,所以30天前的文件日期是2024-02-04
2、hadoop fs -test -e 用于判断HDFS目录/文件是否存在,下一步检测该命令的返回值,以确定其判断结果
(一)情况一:2024-02-04的文件不存在
脚本运行结果:文件不存在
(二)情况二:2024-02-04的文件存在
脚本运行结果:Deleted /user/hive/warehouse/hurys_dc_ods.db/ods_event/day=2024-02-04
day=2024-02-04的文件已删除
成功实现用shell脚本对HDFS文件是否存在进行判断,如果文件存在则删除的目的!
不过,最好在脚本里添加,对这一天ODS层表的分区进行删除,因为ODS层是外部分区表。删除HDFS文件,但ODS层的这一天分区依然存在,只是删除文件后这一天分区没有数据
最终脚本
#! /bin/bash
source /etc/profile
nowdate=`date --date='0 days ago' "+%Y%m%d"`
day_30_ago_date=`date -d "30 day ago " +%Y-%m-%d`
hadoop fs -test -e /user/hive/warehouse/hurys_dc_ods.db/ods_event/day=${day_30_ago_date}
if [ $? -ne 0 ]; then
echo "文件不存在"
else
hdfs dfs -rm -r /user/hive/warehouse/hurys_dc_ods.db/ods_event/day=${day_30_ago_date}
fi
hive -e "
use hurys_dc_ods;
alter table hurys_dc_ods.ods_event drop partition (day='$day_30_ago_date')
"