如何通过时间戳批量删除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的数据的更多相关文章

  1. 批量删除redis的数据

    批量删除redis的数据 # redis-cli -h 192.168.1.17 -p 6379 keys "xiaolang_*"|xargs redis-cli -h 192. ...

  2. 如何通过PhpMyAdmin批量删除MYSQL数据库数据表

    使用这个方法前,强烈建议先备份整个数据库.至于怎么备份?你不会么?在本文下方留言吧. 具体方法:复制下面的php执行语句,保存为sql.php文件(注意配置数据库名称.密码.数据表头),通过ftp上传 ...

  3. hibernate批量删除和更新数据

    转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...

  4. GBase数据库存储过程——批量删除多个数据表的数据

    偶尔需要清空一下数据库,重装成本太高. --清空历史存储过程 DROP Procedure `dap_model`.`delete_datas` ; --创建存储过程 DELIMITER // CRE ...

  5. Hbase如何批量删除指定数据

    有时我们需要批量删除一些hbase中符合某些条件的数据,本文提供一种简单的shell命令的方式批量删除hbase里的数据.思路就是,建立hive与hbase的关联表,通过hive sql查询出符合条件 ...

  6. sqlalchemy批量删除数据、全量删除

    问题:sqlalchemy如何批量删除多条数据解决:使用参数synchronize_session=False,或for循环方法:        users = self.db.query(User) ...

  7. Redis【知识点】批量删除指定Key

    Redis中有删除单条数据的命令DEL但是他没有批量删除多条数据的方法,那我们怎么去批量删除多条数据呢! 第一种方式 /work/app/redis/bin/redis-cli -a youpassw ...

  8. sql Server如何执行批量插入和批量删除

    平时我们sql server执行查询语句都是通过 insert into 表名(字段名,字段名) values(插入值,插入值) --单条插入语句--- insert into Reader(read ...

  9. 【大数据】Hbase如何批量删除指定数据

    一.起因: Hbase是一个列式存储,nosql类型的数据库,类似mongodb. 目前似乎没有提供批量删除的方法,只有一个单行删除的命令:deleteall 'tablename', rowkey ...

随机推荐

  1. 并查集问题hdu 1232

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道 ...

  2. js按钮频繁提交解决方案:

    1.封装js: /// 函数节流 xhz.canRun = true; xhz.Throttling = function () { if (!xhz.canRun) { layer.msg('处理中 ...

  3. Flask无法访问(127.0.0.1:5000)的问题解决方法

    Flask默认开启的ip地址是:http://127.0.0.1:5000/ 但在运行时可能存在无法访问的问题,特别是当我们在linux服务器上搭建flask时,此时需要将代码修改如下: app.ru ...

  4. 无重复字符串的最长子串 python

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  5. centos6克隆虚拟机后,网络无法访问和启动

    使用vmware安装centos6虚拟机时, 克隆虚拟机后无法访问网络. 原因是:产生了重复的网卡信息** 克隆后在70-persistent-net.rules文件中会多一行网卡信息,把第一行网卡信 ...

  6. cmd修改路径

    1.  切换盘符:    输入X:(例如C:)+回车 2.  查看当前目录下的文件:输入dir+回车 3.  选择想要的文件,输入:cd+文件名

  7. Vue.js 教程 -- 实例讲解

    一. Vue.js是什么 Vue.js是一套构建用户界面(view)的MVVM框架.Vue.js的核心库只关注视图层,并且非常容易学习,非常容易与其他库或已有的项目整合. 1.1 Vue.js的目的 ...

  8. Java 之 字节输入流 [InputStream]

    一.字节输入流 java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中. 它定义了字节输入流的基本共性功能方法. 共性方法: public void c ...

  9. SQL SERVER-JOB搬迁脚本

    选中JOB,按F7打开对象游览器: 选中相应的JOB,生成脚本. 搬迁JOB,新实例上要有相应的DB和操作员. 脚本中有2个@enabled,一个是job enable,一个是schedule是否生效 ...

  10. Spring+Dubbo+TestNG接口测试初探

    最近因工作原因,需要测试dubbo接口,通过公司同事写的框架,再结合度娘的帮助,自己做了一些总结记录. 通过下文意在说明如何搭建一个spring + dubbo + testng的测试环境,并完成一个 ...