zoukankan      html  css  js  c++  java
  • hbase 2.0.2 put和delete的一些坑

    测试的inbox表为多版本表,封装的scanTable已设置查询全部版本,以下的测试基于hbase2.0.2

    一.put(针对相同的rowkey)

    测试1.使用方法链的形式对同一个put添加数据到不同的列

     1      Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
     2         Put inboxPut = new Put(Bytes.toBytes("1"));
     3         
     4         //测试1 同一个put添加到相同的列,虽然遍历结果和预期相同,但实际只有后一个addColumn插入到表中
     5         inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"))
     6         .addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993"));
     7         
     8         inbox.put(inboxPut);
     9         
    10         
    11         CellScanner cs = inboxPut.cellScanner();
    12         System.out.println("------put中的数据------");
    13         while(cs.advance()) {
    14             Cell cell = cs.current();
    15             System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
    16             System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
    17             System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
    18             System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
    19         }
    20         scanTable(TABLE_INBOX);

    控制台结果:

    可以看到put中的数据是正确的但是真正插入的数据只有最后一个版本

    测试2.putlist,两个put(rowkey相同),添加到相同的列

    先对测试表进行清空,然后执行以下代码

     1         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
     2         Put inboxPut = new Put(Bytes.toBytes("1"));
     3         inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"));
     4         Put inboxPut2 = new Put(Bytes.toBytes("1"));
     5         inboxPut2.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993"));
     6         List<Put> list = new ArrayList<Put>();
     7         list.add(inboxPut);
     8         list.add(inboxPut2);
     9         inbox.put(list);
    10         
    11         scanTable(TABLE_INBOX);

    结果:

    仍然只有一个版本数据,第二版本覆盖了第一个版本

    测试3.两个put(rowkey相同)插入到同一列

    还是先清空测试表,然后执行以下代码

    1         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
    2         Put inboxPut = new Put(Bytes.toBytes("1"));
    3         inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"));
    4         Put inboxPut2 = new Put(Bytes.toBytes("1"));
    5         inboxPut2.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993"));
    6         
    7         inbox.put(inboxPut);
    8         inbox.put(inboxPut2);
    9         scanTable(TABLE_INBOX);

    结果:

    这次结果与预期一致,两个版本均插入到了表中

    总结:put插入数据时.对于同一rowkey,相同列族下列名相同的列,方法链以及putList的形式均会对插入的多个版本进行覆盖,目前的解决方式是对于一个put.table就put下

    二.delete

     为了方便测试,先对测试表插入了一些数据,即rowkey=1,info:2 下面有两个版本的数据

    测试1.只使用一次addColumn

    1         //测试1 只使用一次addColumn
    2         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
    3         Delete delete = new Delete(Bytes.toBytes("1"));
    4         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
    5         inbox.delete(delete);
    6         scanTable(TABLE_INBOX);

    结果:

    可以看到只删除了一个版本

    测试2.使用方法链的形式,删除两个版本

    先把测试表的数据恢复成两个版本,然后执行以下代码

    1        //测试2 方法链
    2         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
    3         Delete delete = new Delete(Bytes.toBytes("1"));
    4         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"))
    5               .addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
    6         inbox.delete(delete);
    7         scanTable(TABLE_INBOX);

    结果:

    两个版本数据均被删除,满足预期

    测试3.deleteList

    先把测试表恢复成两个版本的数据,然后执行以下代码

     1         //测试3 deleteList
     2         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
     3         Delete delete = new Delete(Bytes.toBytes("1"));
     4         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
     5         Delete delete2 = new Delete(Bytes.toBytes("1"));
     6         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
     7         
     8         List<Delete> list = new ArrayList<Delete>();
     9         list.add(delete);
    10         list.add(delete2);
    11         
    12         inbox.delete(list);
    13         scanTable(TABLE_INBOX);

    结果与预期相符

    测试4. 使用addColumns

    先把测试表数据恢复成两个版本,然后执行以下代码

    1        Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
    2         Delete delete = new Delete(Bytes.toBytes("1"));
    3         delete.addColumns(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
    4         inbox.delete(delete);
    5         scanTable(TABLE_INBOX);

    结果满足预期

    总结:上面只是删除两个版本的数据,删除多版本的时候建议使用addColumns,可以一次性删除某个列的全部版本数据

  • 相关阅读:
    python定时任务:apscheduler的使用(还有一个celery~)
    Python定时任务-schedule vs. Celery vs. APScheduler
    结合Django+celery二次开发定时周期任务
    The Django Book 2.0--中文版
    第十二章: 部署Django
    Django扩展自定义manage命令
    使用django-extension扩展django的manage――runscript命令
    Django | 执行项目下指定的脚本
    C语言宏定义技巧——多次包括头文件内容不同
    《Java并发编程实战》第十章 避免活跃性危急 读书笔记
  • 原文地址:https://www.cnblogs.com/tele-share/p/10007562.html
Copyright © 2011-2022 走看看