Hbase删除指定时间段插入的数据
由于Hbase自身只能删除单条数据,不能够批量删除数据。具体解决办法如下:
思路:
1.通过某一列作为查询条件,根据这个字段时间戳查询到要删除数据的rowkey和这一列值,然后把数据写入到文件中。
scan ''tableName,{ COLUMNS => 't1',TIMERANGE => [1516177518989,1516177790871] }
2.将找出的rowkey进行hbase数据删除语句的拼接并写到shell中,如下图所示,注意文件末尾是有定个写的EOF
3.执行shell脚本。
整个执行流程封装到了一个shell脚本中
#!/bin/bash
echo '--------------程序从这里开始------------'
basepath=$(cd `dirname $0`; pwd)
#basepath=$(cd <code>dirname $0</code>; pwd)
echo '---------------正在创建缓存文件夹--------------'
firstTime="_$1_$2"
mkdir $basepath/CacheOfdelete$firstTime
#touch $basepath/CacheOfdelete$firstTime/data$firstTime.txt
touch $basepath/CacheOfdelete$firstTime/record$firstTime.txt
touch $basepath/CacheOfdelete$firstTime/delete$firstTime.sh
#current1="2018-01-17 16:25:18"
#current2="2018-01-17 16:29:50"
current1="$1 $2"
current2="$3 $4"
tablename="$5"
echo 开始时间:$current1
echo 结束时间:$current2
startSec=`date -d "$current1" +%s`
endSec=`date -d "$current2" +%s`
startTimestamp=$((startSec*1000+`date "+%N"`/1000000))
endTimestamp=$((endSec*1000+`date "+%N"`/1000000))
echo $tablename
echo $startTimestamp
echo $endTimestamp
#echo $startTimestamp > $basepath/CacheOfdelete$firstTime/data$firstTime.txt
##echo $endTimestamp >> $basepath/CacheOfdelete$firstTime/data$firstTime.txt
# #######第一步:通过时间戳找到要删除的数据
# 注:这里只有rowkey和其中一列,因为目的是找到rowkey
echo "scan '$tablename',{ COLUMNS => '$6',TIMERANGE => [$startTimestamp,$endTimestamp]}" | hbase shell > $basepath/CacheOfdelete$firstTime/record$firstTime.txt
# ######第二步:构建删除数据的shell
#echo "#!/bin/bash " >> $basepath/CacheOfdelete$firstTime/aa.sh
echo "#!/bin/bash " >> $basepath/CacheOfdelete$firstTime/delete$firstTime.sh
echo "exec hbase shell <<EOF " >> $basepath/CacheOfdelete$firstTime/delete$firstTime.sh
cat $basepath/CacheOfdelete$firstTime/record$firstTime.txt|awk '{print "deleteall '\'$tablename\''", ",", "'\''"$1"'\''"}' tName="$tablename" >> $basepath/CacheOfdelete$firstTime/delete$firstTime.sh
echo "EOF " >> $basepath/CacheOfdelete$firstTime/delete$firstTime.sh
# ########第三步:执行删除shell
sh $basepath/CacheOfdelete$firstTime/delete$firstTime.sh
echo '---------------正在删除缓存文件夹--------------'
rm -rf $basepath/CacheOfdelete$firstTime
echo '--------------程序到这里结束------------'
执行时按照约定的参数顺序就可以执行:
开始时间戳 结束时间戳 hbase表名 其中任意一列(每行数据都共有的列)
sh del.sh 2010-01-01 00:00:00 2020-12-31 00:00:00 model:test info:name
注意:
该shell执行时产生的中间数据和shell命令在同一目录,执行完成后会自动清除(可在shell中修改是否删除)。请根据你要删除的数据量的大小决定sh执行的位置。
写bash脚本,运行时报$'\r': command not found错误,经过查找,原来是windows和Linux的换行符不同(windows是\r\n,而Linux是\n)导致的
解决办法:
如下:
# vi filename
命令行模式下,输入:
:set ff=unix 将换行符设置成UNIX的模式
(知识扩展:
https://wenda.so.com/q/1534876411219608)
:wq 退出
即可解决这个换行符的问题.