通过时间戳批量删除hbase的数据
如何通过时间戳批量删除hbase的数据
我们使用hive关联hbase插入数据时,有时会写错数据,此时hbase中的数据量已经很大很大了(上亿)。此时,我们要修改错误的数据,只需要删除写错的那部分数据就可以了,但是很遗憾,hbase中没有这样的sql语句(hbase是不能用SQL操作的,这里概指hbase的一套数据库操作语言),怎么办呢。。。
网上找了下,看了这个大佬的方法感觉确实可以。请先移步至大佬原文,然后回来再看(尊重别人的劳动)
原理:
1.通过
scan ''tableName,{ COLUMNS => 't1',TIMERANGE => [1516177518989,1516177790871] }
的方法找出要删除的数据(主要是rowkey和一种任意一列),然后写入到一个文件
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 '--------------程序到这里结束------------'
以上就是shell的代码
执行时的参数顺序:
开始时间戳 结束时间戳 hbase表名 其中任意一列(每行数据都共有的列)
举个栗子:
下图就是我用hive插入数据的任务执行记录
所以我的执行shell的参数顺序就是:
sh deleteWithArgu.sh 2018-01-22 17:11:52 2018-01-22 17:14:53 jia:test base:email_number
注意:
该shell执行时产生的中间数据和shell命令在同一目录,执行完成后会自动清除(可在shell中修改是否删除)。请根据你要删除的数据量的大小决定sh执行的位置。
通过时间戳批量删除hbase的数据的更多相关文章
- 批量删除redis的数据
批量删除redis的数据 # redis-cli -h 192.168.1.17 -p 6379 keys "xiaolang_*"|xargs redis-cli -h 192. ...
- 如何通过PhpMyAdmin批量删除MYSQL数据库数据表
使用这个方法前,强烈建议先备份整个数据库.至于怎么备份?你不会么?在本文下方留言吧. 具体方法:复制下面的php执行语句,保存为sql.php文件(注意配置数据库名称.密码.数据表头),通过ftp上传 ...
- hibernate批量删除和更新数据
转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...
- GBase数据库存储过程——批量删除多个数据表的数据
偶尔需要清空一下数据库,重装成本太高. --清空历史存储过程 DROP Procedure `dap_model`.`delete_datas` ; --创建存储过程 DELIMITER // CRE ...
- Hbase如何批量删除指定数据
有时我们需要批量删除一些hbase中符合某些条件的数据,本文提供一种简单的shell命令的方式批量删除hbase里的数据.思路就是,建立hive与hbase的关联表,通过hive sql查询出符合条件 ...
- sqlalchemy批量删除数据、全量删除
问题:sqlalchemy如何批量删除多条数据解决:使用参数synchronize_session=False,或for循环方法: users = self.db.query(User) ...
- Redis【知识点】批量删除指定Key
Redis中有删除单条数据的命令DEL但是他没有批量删除多条数据的方法,那我们怎么去批量删除多条数据呢! 第一种方式 /work/app/redis/bin/redis-cli -a youpassw ...
- sql Server如何执行批量插入和批量删除
平时我们sql server执行查询语句都是通过 insert into 表名(字段名,字段名) values(插入值,插入值) --单条插入语句--- insert into Reader(read ...
- 【大数据】Hbase如何批量删除指定数据
一.起因: Hbase是一个列式存储,nosql类型的数据库,类似mongodb. 目前似乎没有提供批量删除的方法,只有一个单行删除的命令:deleteall 'tablename', rowkey ...
随机推荐
- vue防止闪屏小技巧:[v-cloak]
css 内添加此属性[v-cloak] { display: none; } html中引入即可 <div v-cloak> {{ message }} </div> 如果觉得 ...
- 如何升级centos7 内核方法
关于内核说明: 版本性质:主分支ml(mainline),稳定版(stable),长期维护lt(longterm) 版本命名格式:“A.B.C" A代表内核版本号 B代表内核主版本号 C代表 ...
- TCP(上)
tcp头格式: TCP状态位: SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置. TCP窗口: TCP 要做流量控制,通信双方各声明 ...
- Python之(matplotlib、numpy、pandas)数据分析
一.Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 它主要用来回事图形,用来展现一些数据,更加直观的展示,让你第一眼就只要数 ...
- C#倒计时关闭提示框
前两天实现某个功能需要做一个提示框 并且能够自动关闭的,就从网上搜了一个能够自动关闭的提示框 ,但由于我需要的场景是不确定计时时间的,所以并没有使用到该窗体,但是我觉得可以留存备用 ,后边也把我 这种 ...
- 【转载】Windows检测到IP地址冲突
今天在使用电脑的过程中,突然弹出个提示,Windows检测到IP地址冲突,此网络中的另一台计算机与该计算机的IP地址相同.联系你的网络管理员解决此问题,有关详细信息,请参阅Windows系统日志.查阅 ...
- elementUI图片墙上传
elementUI提供了照片墙上传的功能,我们直接拿来用. 以下是实现代码: <template> <div style="padding: 50px;"> ...
- MutationObserver
一.MutationObserver Config childList: 添加.删除目标节点的子节点时会收到通知(子节点的后代节点添加或删除时不会收到通知) attribute: 修改目标节点属性时会 ...
- ReactNative报错null is not an object (evaluating '_rngesturehandlermodule.default.direction')
程序报错: null is not an object (evaluating 'rngesturehandlermodule.default.direction') 解决: react-native ...
- UI5-技术篇-Expand与Deep 服务测试
1.SEGW创建服务 2.创建Data Model 2.1Entity Types ZRICO_USR 设置主键.排序字段.过滤字段 ZRICO_USRITM设置主键 2.2Associations ...