美文网首页
HBase Java API

HBase Java API

作者: MasterXiao | 来源:发表于2018-12-25 22:07 被阅读22次

    如何使用Java连接HBase数据库

    Java连接HBase需要两个类:

    • HBaseConfiguration
    • ConnectionFactory
    HBaseConfiguration

    要连接 HBase 我们首先需要创建Configuration对象,这个对象我们需要通过HBaseConfiguration(HBase 配置)对象来进行创建,HBaseConfiguration看名字我们就能猜到它的用途:读取指定路径下hbase-site.xmlhbase-default.xml的配置信息

    具体用法:

     Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
    
    ConnectionFactory

    获取到连接对象Connextion我们就算连接上了HBase了,怎么获取呢?

    通过ConnectionFactory(连接工厂)的方法我们就能获取到Connection(连接对象)了。

    具体用法:

    Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象
    

    使用这两个步骤就能完成连接 HBase 了。

    注意:在1.0之前的版本HBase是使用HBaseAdmin和HTable等来操作HBase的,但是在1.0之后的版本中这些被弃用了,新的客户端API更加干净简洁,本文使用的HBase是2.1.1版本(18年10月发布)的,

    创建表

    要创建表我们需要首先创建一个Admin对象,然后让它来创建一张表:

    Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
    TableName tableName = TableName.valueOf("test");//定义表名
    
    HTableDescriptor htd = new HTableDescriptor(tableName);//定义表对象
    
    HColumnDescriptor hcd = new HColumnDescriptor("data");//定义列族对象
    
    htd.addFamily(hcd); //添加
    
    admin.createTable(htd);//创建表
    
    

    HBase2.X创建表

    上述创建表的方法是 HBase1.X 版本的方式,而在 HBase2.X 的版本中创建表使用了新的 API,创建表关键代码如下:

    TableName tableName = TableName.valueOf("test");//定义表名
    //TableDescriptor对象通过TableDescriptorBuilder构建;
    TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
    ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
    tableDescriptor.setColumnFamily(family);//设置列族
    admin.createTable(tableDescriptor.build());//创建表
    

    在 2.X 版本中主要是HTableDescriptor对象被弃用,取而代之的是TableDescriptor对象,TableDescriptor对象通过TableDescriptorBuilder构建;

    TableName tableName = TableName.valueOf("test");
    TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
    

    然后添加列簇方法变更:

    ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
    tableDescriptor.setColumnFamily(family);        //设置列族
    

    最后由Admin对象进行创建表操作:

    admin.createTable(tableDescriptor.build());
    

    值得咱们注意的是,如果你的 HBase 环境是 1.X 的那么你只能使用第一种方式来创建表,如果是 2.X 的版本,那么两种方式你都可以使用(本实训使用的 HBase 是 2.1.1 版本,所以两种都可用)。

    添加数据

    要对一个表添加数据,我们需要一个Put对象,在定义Put对象之前我们需要获取到Table对象,这样才能对指定的表进行操作:

    Table table = connection.getTable(tableName);//获取Table对象
    try {
        byte[] row = Bytes.toBytes("row1"); //定义行
        Put put = new Put(row);             //创建Put对象
        byte[] columnFamily = Bytes.toBytes("data");    //列
        byte[] qualifier = Bytes.toBytes(String.valueOf(1)); //列族修饰词
        byte[] value = Bytes.toBytes("张三丰");    //值
        put.addColumn(columnFamily, qualifier, value);
        table.put(put);     //向表中添加数据
    
    } finally {
        //使用完了要释放资源
        table.close();
    }
    

    获取指定行的数据

    我们使用Get对象与Table对象就可以获取到表中的数据了。

    //获取数据
    Get get = new Get(Bytes.toBytes("row1"));   //定义get对象
    Result result = table.get(get);         //通过table对象获取数据
    System.out.println("Result: " + result);
    //很多时候我们只需要获取“值” 这里表示获取 data:1 列族的值
    byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); //获取到的是字节数组
    //将字节转成字符串
    String valueStr = new String(valueBytes,"utf-8");
    System.out.println("value:" + valueStr);
    
    

    上述代码就可以查到table对象中行row1的数据了,亲自试试验证一下结果吧。

    扫描表中的数据

    只获取一行数据显然不能满足我们全部的需求,我们想要获取表中所有的数据应该怎么操作呢?

    ScanResultScanner对象就派上用场了,接下来我们看个示例你应该就明白这两个对象的用法了:

    Scan scan = new Scan();
    ResultScanner scanner = table.getScanner(scan);
    try {
        for (Result scannerResult: scanner) {
            System.out.println("Scan: " + scannerResult);
             byte[] row = scannerResult.getRow();
             System.out.println("rowName:" + new String(row,"utf-8"));
        }
    } finally {
        scanner.close();
    }
    

    这样就能将指定表中的数据全部输出到控制台了。

    运行上述代码你会看到类似这样的结果:

    Scan: keyvalues={row1/data:1/1542657887632/Put/vlen=6/seqid=0}
    rowName:row1
    Scan: keyvalues={row2/data:2/1542657887634/Put/vlen=6/seqid=0}
    rowName:row2

    将表的数据和行以及列都展示了。

    删除表

    和 HBase shell 的操作一样,在 Java 中我们要删除表,需要先禁用他,然后在删除它。

    代码很简单:

    TableName tableName = TableName.valueOf("test");
    admin.disableTable(tableName);  //禁用表
    admin.deleteTable(tableName);   //删除表
    

    相关文章

      网友评论

          本文标题:HBase Java API

          本文链接:https://www.haomeiwen.com/subject/ekwqlqtx.html