使用java API操作hbase增删改查的几个示例

使用java代码来实现Hbase数据库对数据的增删改查操作,总结示例如下:

首先创建一个Maven工程,需要导入的包如下:

org.apache.hbaseh,base-client,1.2.1
org.apache.hbase,hbase-server,1.2.1
junit,junit,4.12
org.testng,testng,6.14.3
org.testng,testng,7.0.0
junit,junit,4.12

创建表

创建一张myuser表,带有两个列族f1,f2

public void createTable() throws IOException {
  //连接hbase集群
  Configuration configuration = HBaseConfiguration.create();
  //指定hbase的zk连接地址
  configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  Connection connection = ConnectionFactory.createConnection(configuration);
  //获取管理员对象
  Admin admin = connection.getAdmin();
  //通过管理员对象创建表
  HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("myuser"));
  //给表添加列族
  HColumnDescriptor f1 = new HColumnDescriptor("f1");
  HColumnDescriptor f2 = new HColumnDescriptor("f2");
  //将两个列族设置到 创建的表中
  hTableDescriptor.addFamily(f1);
  hTableDescriptor.addFamily(f2);
  //创建表
  admin.createTable(hTableDescriptor);
  //关闭连接
  admin.close();
  connection.close();
}

插入数据

向创建的myuser表中插入数据;

public void addData() throws IOException {
    //获取连接
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
    Connection connection = ConnectionFactory.createConnection(configuration);
    //获取表对象
    Table myuser = connection.getTable(TableName.valueOf("myuser"));
    Put put = new Put("0001".getBytes());
    put.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(1));
    put.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("小李子"));
    put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(18));
    put.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("火星人"));
    put.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("13033607199"));
    myuser.put(put);
    //关闭表
    myuser.close();
}

查询数据

为了便于下面查询操作,这里插入一批初始数据。

public void insertBatchData() throws IOException {
    //获取连接
    Configuration configuration = HBaseConfiguration.create();
    configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181");
    Connection connection = ConnectionFactory.createConnection(configuration);
    //获取表
    Table myuser = connection.getTable(TableName.valueOf("myuser"));
    //创建put对象,并指定rowkey
    Put put = new Put("0002".getBytes());
    put.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(1));
    put.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("曹操"));
    put.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(30));
    put.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
    put.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("沛国谯县"));
    put.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("16888888888"));
    put.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("helloworld"));

    Put put2 = new Put("0003".getBytes());
    put2.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(2));
    put2.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("刘备"));
    put2.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(32));
    put2.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
    put2.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("幽州涿郡涿县"));
    put2.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("17888888888"));
    put2.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("talk is cheap , show me the code"));

    Put put3 = new Put("0004".getBytes());
    put3.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(3));
    put3.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("孙权"));
    put3.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(35));
    put3.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
    put3.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("下邳"));
    put3.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("12888888888"));
    put3.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("what are you 弄啥嘞!"));

    Put put4 = new Put("0005".getBytes());
    put4.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(4));
    put4.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("诸葛亮"));
    put4.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28));
    put4.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
    put4.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("四川隆中"));
    put4.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("14888888888"));
    put4.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("出师表你背了嘛"));

    Put put5 = new Put("0005".getBytes());
    put5.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5));
    put5.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("司马懿"));
    put5.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(27));
    put5.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
    put5.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("哪里人有待考究"));
    put5.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15888888888"));
    put5.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("跟诸葛亮死掐"));

    Put put6 = new Put("0006".getBytes());
    put6.addColumn("f1".getBytes(),"id".getBytes(),Bytes.toBytes(5));
    put6.addColumn("f1".getBytes(),"name".getBytes(),Bytes.toBytes("xiaobubu—吕布"));
    put6.addColumn("f1".getBytes(),"age".getBytes(),Bytes.toBytes(28));
    put6.addColumn("f2".getBytes(),"sex".getBytes(),Bytes.toBytes("1"));
    put6.addColumn("f2".getBytes(),"address".getBytes(),Bytes.toBytes("内蒙人"));
    put6.addColumn("f2".getBytes(),"phone".getBytes(),Bytes.toBytes("15788888888"));
    put6.addColumn("f2".getBytes(),"say".getBytes(),Bytes.toBytes("貂蝉去哪了"));

    List<Put> listPut = new ArrayList<Put>();
    listPut.add(put);
    listPut.add(put2);
    listPut.add(put3);
    listPut.add(put4);
    listPut.add(put5);
    listPut.add(put6);

    myuser.put(listPut);
    myuser.close();
}
通过Get查找单行数据

在查询的时候需要注意,列值的类型。

public void getData() throws IOException {
  //获取连接
  Configuration configuration = HBaseConfiguration.create();
  configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  Connection connection = ConnectionFactory.createConnection(configuration);
  //获取表对象
  Table myuser = connection.getTable(TableName.valueOf("myuser"));
  Get get = new Get("0003".getBytes());
  get.addColumn("f1".getBytes(),"id".getBytes());
  //获取返回结果
  Result result = myuser.get(get);
  List<Cell> cells = result.listCells();
  for (Cell cell : cells) {
    //获取列族的名称
    String familyName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
    //获取列的名称
    String columnName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
    if ( familyName.equals("f1") && columnName.equals("id") || columnName.equals("age")){
      int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
      System.out.println("列族名: " + familyName + " ,列名: " + columnName + " ,列值:" + value);
    } else {
      String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
      System.out.println("列族名: " + familyName + " ,列名: " + columnName + " ,列值:" + value);
    }
  }
  //关闭表
  myuser.close();
}
通过Scan扫描全表
public void scanAllData() throws IOException {
  //获取连接
  Configuration configuration = HBaseConfiguration.create();
  configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  Connection connection = ConnectionFactory.createConnection(configuration);
  //获取表对象
  Table myuser = connection.getTable(TableName.valueOf("myuser"));
  Scan scan = new Scan();
  //设置起始和结束的rowkey,扫描结果是:[)类型
  scan.setStartRow("0004".getBytes());
  scan.setStopRow("0008".getBytes());
  ResultScanner scanner = myuser.getScanner(scan);
  for (Result result : scanner) {
    List<Cell> cells = result.listCells();
    for (Cell cell : cells) {
      String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
      //获取列族的名称
      String familyName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
      //获取列的名称
      String columnName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
      if ( familyName.equals("f1") && columnName.equals("id") || columnName.equals("age")){
        int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
        System.out.println("列族名: " + familyName + " ,列名: " + columnName + " ,列值:" + value);
      } else {
        String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
        System.out.println("列族名: " + familyName + " ,列名: " + columnName + " ,列值:" + value);
      }
    }
  }
  //获取返回结果
  myuser.close();
}

过滤器查询

过滤器主要分成两大类——比较过滤器、专用过滤器。其作用是在服务器端判断数据是否满足条件,然后只将满足条件的数据返回给客户端。

比较运算符:

  • LESS
  • LESS_OR_EQUAL
  • EQUAL
  • NOT_EQUAL
  • GREATER_OR_EQUAL
  • GREATER
  • NO_OP 排除所有

比较器:

  • BinaryComparator:按字节索引顺序比较指定字节数组
  • BinaryPrefixComparator:同上,比较左端的数据是否相同
  • NullComparator:判断给定的是否为空
  • BitComparator:按位比较
  • RegexStringComparator:提供一个正则比较强,仅支持EQUAL和非EQUAL
  • SubstringComparator:判断提供的字串是否出现在value中
比较过滤器
rowkey过滤器
public void rowKeyFilter() throws IOException {
  //获取连接
  Configuration configuration = HBaseConfiguration.create();
  configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  Connection connection = ConnectionFactory.createConnection(configuration);
  //获取表对象
  Table myuser = connection.getTable(TableName.valueOf("myuser"));
  Scan scan = new Scan();

  /**
  * 过滤器代码部分 start
  */
  RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("0003")));
  scan.setFilter(rowFilter);
  /**
  * 过滤器代码部分 end
  */

  ResultScanner scanner = myuser.getScanner(scan);
  for (Result result : scanner) {
    List<Cell> cells = result.listCells();
    for (Cell cell : cells) {
      String rowkey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
      //获取列族的名称
      String familyName = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
      //获取列的名称
      String columnName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
      if ( familyName.equals("f1") && columnName.equals("id") || columnName.equals("age")){
        int value = Bytes.toInt(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
        System.out.println("列族名: " + familyName + " ,列名: " + columnName + " ,列值:" + value);
      } else {
        String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
        System.out.println("列族名: " + familyName + " ,列名: " + columnName + " ,列值:" + value);
      }
    }
  }
  //获取返回结果
  myuser.close();
}

以下代码只提供过滤器部分的代码,其它的代码同上一样

列族过滤器
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.LESS, new SubstringComparator("f2"));
scan.setFilter(familyFilter);
列过滤器
QualifierFilter name = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("name"));
scan.setFilter(name);
列值过滤器
ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("8"));
scan.setFilter(valueFilter);
专用过滤器
单列值过滤器

返回满足条件数据的所有字段

SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareFilter.CompareOp.EQUAL, "刘备".getBytes());
scan.setFilter(singleColumnValueFilter);
列值排除过滤器

与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回。

rowkey前缀过滤器
PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());
scan.setFilter(prefixFilter);
分页过滤器
多过滤器查询

当需要使用多个过滤器来筛选数据的时候,可以采用FilterList。

FilterList filterList = new FilterList();
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareFilter.CompareOp.EQUAL, "刘备".getBytes());
PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());
filterList.addFilter(singleColumnValueFilter);
filterList.addFilter(prefixFilter);
scan.setFilter(filterList);

删除数据

public void deleteData() throws IOException {
  //获取连接
  Configuration configuration = HBaseConfiguration.create();
  configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  Connection connection = ConnectionFactory.createConnection(configuration);
  //获取表对象
  Table myuser = connection.getTable(TableName.valueOf("myuser"));

  Delete delete = new Delete("0007".getBytes());
  myuser.delete(delete);

  myuser.close();
}

删除表

public void deleteTable() throws IOException {
  //获取连接
  Configuration configuration = HBaseConfiguration.create();
  configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
  Connection connection = ConnectionFactory.createConnection(configuration);
  //获取管理员对象
  Admin admin = connection.getAdmin();
  //禁用表
  admin.disableTable(TableName.valueOf("myuser"));
  //删除表
  admin.deleteTable(TableName.valueOf("myuser"));
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是Java API实现HBase增删改查操作示例代码: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; public class HBaseExample { public static void main(String[] args) throws Exception { // 创建HBase配置对象 Configuration config = HBaseConfiguration.create(); // 设置Zookeeper地址 config.set("hbase.zookeeper.quorum", "localhost"); // 获取HBase连接 try (Connection connection = ConnectionFactory.createConnection(config)) { // 获取表对象 Table table = connection.getTable(TableName.valueOf("test_table")); // 插入数据 Put put = new Put("rowkey".getBytes()); put.addColumn("cf".getBytes(), "col1".getBytes(), "value1".getBytes()); put.addColumn("cf".getBytes(), "col2".getBytes(), "value2".getBytes()); table.put(put); // 查询数据 Get get = new Get("rowkey".getBytes()); Result result = table.get(get); byte[] value = result.getValue("cf".getBytes(), "col1".getBytes()); System.out.println(new String(value)); // 修改数据 Put update = new Put("rowkey".getBytes()); update.addColumn("cf".getBytes(), "col1".getBytes(), "new_value".getBytes()); table.put(update); // 删除数据 Delete delete = new Delete("rowkey".getBytes()); delete.addColumn("cf".getBytes(), "col1".getBytes()); table.delete(delete); // 关闭表对象 table.close(); } } } ``` 注意替换代码中的`localhost`为你的Zookeeper地址,并替换`test_table`为你的表名。同时,需要添加HBase客户端依赖包到你的项目中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栖溪阁晓生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值