背景是华为大数据平台mrs,这里运用到HDFS、Hive、HBase;数据通过接口接入到hbase,用hive创建hbase外部表。需求是某段时间数据有问题,需要删掉重新补入。

HBase删除操作

1 delete命令:删除某列数据
在HBase中,可以使用delete命令来将一个单元格的数据删除。
语法格式如下:delete '表名', 'rowkey', '列蔟:列'

2 deleteall命令:删除整行数据
deleteall命令可以将指定rowkey对应的所有列全部删除。
语法格式如下:deleteall '表名','rowkey'

3 truncate命令:清空表
truncate命令用来清空某个表中的所有数据。
语法:truncate "表名"

1、获取rowkey

方法1:通过hbase命令scan,TIMERANGE这个是通过数据的插入时间进行过滤

scan 'tablename',{ COLUMNS => 'f1:times',TIMERANGE => [1672502400000,1676304000000], LIMIT => 1, FORMATTER => 'toString'}

--LIMIT => 1:查看1条数据
--FORMATTER => 'toString':转换数据里的中文

方法2:通过hbase命令scan,ValueFilter这个是通过数据的值进行过滤

scan 'tablename',{ COLUMNS => 'f1:times',FILTER => "ValueFilter( >=, 'binary:2023-01-01')", LIMIT => 1, FORMATTER => 'toString'}

方法3:通过hive命令直接过滤查询出rowkey(最简单,前提是在hive创建了hbase外部表)

# 进入beeline,(华为mrs只能使用beeline,hive不可用)
beeline -u jdbc:hive2://hadoop1:10000/default

# 将结果导出HDFS
insert overwrite directory '/home/data/' select rowkey from hive_table;

# 数据下载到服务器本地
hadoop fs -get /home/data/000000_0 /tmp/date_20230214.txt

---------------------------------------------------------------------
# 直接将结果导出到本地,使用关键字local(这个方法在mrs没成功)
insert overwrite local directory '/home/data/' select rowkey from hive_table;

2、把rowkey拼接成hbase删除语句

方法1:使用hbase scan命令,整个流程封装到一个shell脚本中(我的数据rowkey中有中文和空格,所以最后执行结果只删掉了部分数据,并没有把想要的数据全删掉)

#!/bin/bash

touch /home/data/record.txt
touch /home/data/delete.sh

# #######第一步:通过时间戳找到要删除的数据
# 注:这里只有rowkey和其中一列,因为目的是找到rowkey
echo "scan 'tablename',{ COLUMNS => 'f1:times',FILTER => "ValueFilter( >=, 'binary:2023-01-01')", FORMATTER => 'toString'}" | hbase shell > /home/data/record.txt
# #######第二步:构建删除数据的shell
echo "#!/bin/bash " >> /home/data/delete.sh
echo "exec hbase shell <<EOF " >> /home/data/delete.sh
cat /home/data/record.txt | awk '{print "deleteall '\'$tablename\''", ",", "'\''"$1"'\''"}' tName="$tablename" >> /home/data/delete.sh
echo "EOF " >> /home/data/delete.sh
# #######第三步:执行删除shell
sh /home/data/delete.sh

方法2:使用hive命令可以直接拼接成hbase语句,但要把查询出来的结果中tablename和rowkey的替换成

select 'deleteall "tablename ,"'||rowkey ||'"' from hive_table where times >='2023-01-01';

使用hbase命令执行文件

hbase shell /tmp/date_20230214.txt