admin

Hbase 客户端 API 系列(二) - Delete 操作
现有如下表数据: rowkey baseinfo is...
扫描右侧二维码阅读全文
26
2018/10

Hbase 客户端 API 系列(二) - Delete 操作

现有如下表数据:

rowkey baseinfo
isbn publisher name price
book:1 11111111 人民出版社 计算机组成原理 25

我们需要做的就是通过客户端 API 删除这一行数据。
很简单,HTable类给我们提供了delete()方法来进行删除,它有两个重写的方法:

  • public void delete(final Delete delete) throws IOException
  • public void delete(List<Delete> deletes) throws IOException

也就是单一删除和批量删除。
由于比较简单,这里我就只演示单一删除了:

public class DeleteTest {

    public static void main(String[] args) throws IOException {
        Configuration conf = HBaseConfiguration.create();

        Connection conn = ConnectionFactory.createConnection(conf);

        HTable table = (HTable) conn.getTable(TableName.valueOf("tb_test"));

        Put put = new Put(Bytes.toBytes("book:1"));
        put.addColumn(Bytes.toBytes("baseinfo"), Bytes.toBytes("isbn"), Bytes.toBytes("11111111"));
        put.addColumn(Bytes.toBytes("baseinfo"), Bytes.toBytes("publisher"), Bytes.toBytes("人民出版社"));
        put.addColumn(Bytes.toBytes("baseinfo"), Bytes.toBytes("name"), Bytes.toBytes("计算机组成原理"));
        put.addColumn(Bytes.toBytes("baseinfo"), Bytes.toBytes("price"), Bytes.toBytes("25"));

        table.put(put);

        show(table, "book:1");

        table.delete(new Delete(Bytes.toBytes("book:1")));

        show(table, "book:1");

        table.close();
        conn.close();
    }

    public static void show(HTable table, String rowKey) throws IOException {

        Get get = new Get(Bytes.toBytes(rowKey));
        Result rs = table.get(get);

        if (rs.isEmpty()) {
            System.out.println("无此数据!");
        }

        for (Cell cell : rs.rawCells()) {
            System.out.println("列簇:" + Bytes.toString(CellUtil.cloneFamily(cell)) + "\t" +
                    "列修饰符:" + Bytes.toString(CellUtil.cloneQualifier(cell)) + "\t" +
                    "列值:" + Bytes.toString(CellUtil.cloneValue(cell)) + "\t" +
                    "时间戳:" + cell.getTimestamp());
        }
        System.out.println();
    }
}

运行结果:

列簇:baseinfo    列修饰符:isbn    列值:11111111    时间戳:1540542478290
列簇:baseinfo    列修饰符:name    列值:计算机组成原理    时间戳:1540542478290
列簇:baseinfo    列修饰符:price    列值:25    时间戳:1540542478290
列簇:baseinfo    列修饰符:publisher    列值:人民出版社    时间戳:1540542478290

无此数据!

可以看到,delete()方法我们传入了一个Delete对象,新建Delete对象的时候我们传入了一个参数,这个参数也就是数据的rowkey行键。
然后我们直接执行delete()方法,删除成功!
继续观察Delete类有哪些方法,以下列举了一些常用的:

  1. public Delete add(Cell cell) throws IOException
  2. public Delete addFamily(byte[] family)
  3. public Delete addFamily(byte[] family, long timestamp)
  4. public Delete addFamilyVersion(byte[] family, long timestamp)
  5. public Delete addColumns(byte[] family, byte[] qualifier)
  6. public Delete addColumns(byte[] family, byte[] qualifier, long timestamp)
  7. public Delete addColumn(byte[] family, byte[] qualifier)
  8. public Delete addColumn(byte[] family, byte[] qualifier, long timestamp)

第一个方法:
  指定要删除的单元格位置,一个Cell对应一个单元格。
第二个方法:
  删除某个列簇下所有版本的所有列。
第三个方法:
  删除某个列簇下所有小于等于timestamp版本的所有列。
第四个方法:
  删除某个列簇下等于timestamp版本的所有列(注意和上一个方法的区别)。
第五个方法:
  删除某一列所有版本的值。
第六个方法:
  删除某一列所有小于等于timestamp版本的值。
第七个方法:
  删除某一列最后一个版本的值(注意和addColumns的区别,addColumn都是只能删除某个版本的列的值,而addColumns删除的是某列所有版本的值或者小于等于某个版本的值,下同)。
第八个方法:
  删除某一列所有等于timestamp版本的值。

上面的 8 个方法就不一一试验了,有兴趣的可以试一下。
上面代码中直接传入Delete对象,没有调用任何上面的方法,删除的是rowkey的所有列。

Last modification:October 26th, 2018 at 06:10 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment