Hbase删除指定时间段插入的数据

本文介绍了一种通过HBase shell脚本批量删除在特定时间段内插入的数据的方法,涉及时间戳查询、数据记录、构建删除命令及执行过程,适用于大规模数据清理需求。

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 退出

即可解决这个换行符的问题.

### HBase 中的 Delete 操作详解 HBase删除操作与其他传统关系型数据库有所不同。它并非立即从存储中物理删除数据,而是在目标 KeyValue 存储单元上标记删除标识[^1]。这种机制允许 HBase 延迟实际的数据清理过程,在后续的 Region 合并或分裂期间完成真正的数据移除。 #### 删除操作的核心原理 当执行删除操作时,HBase 并不会直接定位到需要删除的记录并将其清除。相反,HBase 会在底层插入一条新记录,并将此记录的 key type 设置为 `Delete` 状态,以此来标记对应的数据已被删除[^2]。在读取过程中,如果遇到带有 `Delete` 标记的记录且其时间戳为最新,则认为该条记录已经被逻辑删除。 #### 版本控制与删除行为 HBase 支持多版本管理功能,因此删除操作可以针对特定版本进行。如果不显式指定删除的具体版本,默认情况下会使用当前时间作为时间戳 (`currentTimeMillis`),从而删除小于等于该时间戳的所有版本数据[^3]。这使得用户能够灵活地选择哪些历史版本应该保留或者彻底废弃掉。 以下是实现这一特性的几个重要方面: - **墓碑 (Tombstone)**: 当发起一次删除请求时,HBase 实际上创建了一个特殊的元数据项——即所谓的 “墓碑”。这个墓碑用来指示某个范围内的 cell 已经不再有效。 - **延迟回收**: 被标记为已删除数据仍然存在于磁盘文件里直到 compaction 进程运行完毕为止,compaction 是一种后台优化程序用于合并多个小文件成更大的单一文件的同时丢弃那些已经过期/被覆盖的内容. 下面给出一段 Python 示例代码展示如何利用 HappyBase 库来进行基本的 row-level 和 column qualifier level 的删除: ```python import happybase def connect_to_hbase(): connection = happybase.Connection('localhost') return connection def delete_row(table_name, row_key): conn = connect_to_hbase() table = conn.table(table_name) # Deletes the entire row associated with 'row_key' table.delete(row_key) def delete_columns(table_name, row_key, columns_list): conn = connect_to_hbase() table = conn.table(table_name) # Deletes specific columns within a given row table.delete(row_key, columns=columns_list) if __name__ == "__main__": TABLE_NAME = "my_table" ROW_KEY_TO_DELETE = b"example_row_key" # Example usage of deleting whole rows delete_row(TABLE_NAME, ROW_KEY_TO_DELETE) COLUMNS_LIST = [b'cf1:col1', b'cf1:col2'] delete_columns(TABLE_NAME, ROW_KEY_TO_DELETE, COLUMNS_LIST) ``` 上述脚本展示了两种类型的删除方式:一是整个行级删除;二是基于列限定符的选择性删除。注意这里使用的参数都是字节串形式(`bytes`)因为这是大多数 NoSQL 数据库 API 所期望的形式之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值