如何使用Java连接HBase数据库

如何使用Java连接HBase数据库

Java连接HBase需要两个类:

  • HBaseConfiguration
  • ConnectionFactory

HBaseConfiguration

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

具体用法:

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

ConnectionFactory

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

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

具体用法:

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

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

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

创建表

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

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

HBase2.X创建表

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

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

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

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

然后添加列簇方法变更:

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

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

  1. admin.createTable(tableDescriptor.build());

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

HBase创建表示例

请你编写一个Java程序,在HBase中创建表dept,emp,列都为:data

  1. package step1;
  2. import java.io.IOException;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.HColumnDescriptor;
  6. import org.apache.hadoop.hbase.HTableDescriptor;
  7. import org.apache.hadoop.hbase.TableName;
  8. import org.apache.hadoop.hbase.client.Admin;
  9. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
  10. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
  11. import org.apache.hadoop.hbase.client.Connection;
  12. import org.apache.hadoop.hbase.client.ConnectionFactory;
  13. import org.apache.hadoop.hbase.client.Get;
  14. import org.apache.hadoop.hbase.client.Put;
  15. import org.apache.hadoop.hbase.client.Result;
  16. import org.apache.hadoop.hbase.client.ResultScanner;
  17. import org.apache.hadoop.hbase.client.Scan;
  18. import org.apache.hadoop.hbase.client.Table;
  19. import org.apache.hadoop.hbase.client.TableDescriptor;
  20. import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
  21. import org.apache.hadoop.hbase.util.Bytes;
  22. public class Task{
  23.     
  24.     public void createTable()throws Exception{
  25.         /********* Begin *********/
  26.         Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
  27.         Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象
  28.         try{
  29.             Admin admin = connection.getAdmin();
  30.             try{
  31.                 TableName tableName = TableName.valueOf("dept");
  32.                 TableDescriptorBuilder  tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
  33.                 ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();
  34.                 tableDescriptor.setColumnFamily(family);
  35.                 admin.createTable(tableDescriptor.build());
  36.                 TableName emp = TableName.valueOf("emp");
  37.                 TableDescriptorBuilder emptableDescriptor = TableDescriptorBuilder.newBuilder(emp);
  38.                 ColumnFamilyDescriptor empfamily = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();
  39.                 emptableDescriptor.setColumnFamily(empfamily);
  40.                 admin.createTable(emptableDescriptor.build());
  41.             }finally{
  42.                 admin.close();
  43.             }
  44.             
  45.         }finally{
  46.             connection.close();
  47.         }
  48.         /********* End *********/
  49.     }
  50. }

添加数据

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

  1. Table table = connection.getTable(tableName);//获取Table对象
  2. try {
  3.     byte[] row = Bytes.toBytes("row1");    //定义行
  4.     Put put = new Put(row);                //创建Put对象
  5.     byte[] columnFamily = Bytes.toBytes("data");    //列簇
  6.     byte[] qualifier = Bytes.toBytes(String.valueOf(1)); //
  7.     byte[] value = Bytes.toBytes("张三丰");    //
  8.     put.addColumn(columnFamily, qualifier, value);
  9.     table.put(put);        //向表中添加数据
  10. } finally {
  11.     //使用完了要释放资源
  12.     table.close();
  13. }

添加数据示例:

  1. package step2;
  2. import java.io.IOException;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.HColumnDescriptor;
  6. import org.apache.hadoop.hbase.HTableDescriptor;
  7. import org.apache.hadoop.hbase.TableName;
  8. import org.apache.hadoop.hbase.client.Admin;
  9. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
  10. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
  11. import org.apache.hadoop.hbase.client.Connection;
  12. import org.apache.hadoop.hbase.client.ConnectionFactory;
  13. import org.apache.hadoop.hbase.client.Get;
  14. import org.apache.hadoop.hbase.client.Put;
  15. import org.apache.hadoop.hbase.client.Result;
  16. import org.apache.hadoop.hbase.client.ResultScanner;
  17. import org.apache.hadoop.hbase.client.Scan;
  18. import org.apache.hadoop.hbase.client.Table;
  19. import org.apache.hadoop.hbase.client.TableDescriptor;
  20. import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
  21. import org.apache.hadoop.hbase.util.Bytes;
  22. public class Task {
  23.   public void insertInfo()throws Exception{
  24.           /********* Begin *********/
  25.         Configuration config = HBaseConfiguration.create();
  26.         Connection connection = ConnectionFactory.createConnection(config);
  27.         Admin admin = connection.getAdmin();
  28.         TableName tableName = TableName.valueOf("tb_step2"); //定义表名
  29.         TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
  30.         ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//  构建列族对象
  31.         tableDescriptor.setColumnFamily(family); //  设置列族
  32.         admin.createTable(tableDescriptor.build()); //  创建表
  33.         
  34.         Table table = connection.getTable(tableName);//获取Table对象
  35.         // 添加数据
  36.         try{
  37.             byte[] row1 = Bytes.toBytes("row1");
  38.             Put put1 = new Put(row1);
  39.             byte[] columnFamily1 = Bytes.toBytes("data"); //
  40.             byte[] qualifier1 = Bytes.toBytes(String.valueOf(1)); // 列族修饰词
  41.             byte[] value1 = Bytes.toBytes("张三丰"); //
  42.             put1.addColumn(columnFamily1, qualifier1, value1);
  43.             table.put(put1);
  44.             byte[] row2 = Bytes.toBytes("row2");
  45.             Put put2 = new Put(row2);
  46.             byte[] columnFamily2 = Bytes.toBytes("data"); //
  47.             byte[] qualifier2 = Bytes.toBytes(String.valueOf(2)); // 列族修饰词
  48.             byte[] value2 = Bytes.toBytes("张无忌"); //
  49.             put2.addColumn(columnFamily2, qualifier2, value2);
  50.             table.put(put2);
  51.         }finally {
  52.             //使用完了要释放资源
  53.             table.close();
  54.         }
  55.           /********* End *********/
  56.   }
  57. }

获取指定行的数据

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

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

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

扫描表中的数据

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

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

  1. Scan scan = new Scan();
  2. ResultScanner scanner = table.getScanner(scan);
  3. try {
  4.     for (Result scannerResult: scanner) {
  5.         System.out.println("Scan: " + scannerResult);
  6.          byte[] row = scannerResult.getRow();
  7.          System.out.println("rowName:" + new String(row,"utf-8"));
  8.     }
  9. } finally {
  10.     scanner.close();
  11. }

编程要求

使用本关知识,在右侧编辑器begin-end处补充代码,输出t_step3表中行号为row1,列族为data:1的值(以utf-8编码),输出table_step3表中所有行的行名称(因为直接输出scannerResult会带有时间戳,所以输出行名方便测评)。

  1. import java.io.IOException;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.HBaseConfiguration;
  4. import org.apache.hadoop.hbase.HColumnDescriptor;
  5. import org.apache.hadoop.hbase.HTableDescriptor;
  6. import org.apache.hadoop.hbase.TableName;
  7. import org.apache.hadoop.hbase.client.Admin;
  8. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
  9. import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
  10. import org.apache.hadoop.hbase.client.Connection;
  11. import org.apache.hadoop.hbase.client.ConnectionFactory;
  12. import org.apache.hadoop.hbase.client.Get;
  13. import org.apache.hadoop.hbase.client.Put;
  14. import org.apache.hadoop.hbase.client.Result;
  15. import org.apache.hadoop.hbase.client.ResultScanner;
  16. import org.apache.hadoop.hbase.client.Scan;
  17. import org.apache.hadoop.hbase.client.Table;
  18. import org.apache.hadoop.hbase.client.TableDescriptor;
  19. import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
  20. import org.apache.hadoop.hbase.util.Bytes;
  21. public class Task {
  22.   public void queryTableInfo()throws Exception{
  23.           /********* Begin *********/
  24.         try{
  25. //连接HBase
  26.           Configuration config = HBaseConfiguration.create();
  27.           Connection connection = ConnectionFactory.createConnection(config);//config为前文的配置对象
  28.             Admin admin = connection.getAdmin();//使用连接对象获取Admin对象
  29. //获取表   
  30.             TableName tableName = TableName.valueOf("tb_step2"); //定义表名
  31.             Table table = connection.getTable(tableName);//获取Table对象
  32.          
  33. //获取数据
  34.             Get get = new Get(Bytes.toBytes("row1"));    //定义get对象
  35.             Result result = table.get(get);            //通过table对象获取数据
  36.             System.out.println("Result: " + result);
  37.             //很多时候我们只需要获取这里表示获取 data:1 列族的值
  38.             byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); //获取到的是字节数组
  39.         
  40. //将字节转成字符串
  41.             String valueStr = new String(valueBytes,"utf-8");
  42.             System.out.println("value:" + valueStr);
  43.          
  44.          
  45.             Table step3Table = connection.getTable(tableStep3Name);
  46. //批量查询
  47.             Scan scan = new Scan();
  48.             ResultScanner scanner = table.getScanner(scan);
  49.             try {
  50.                 for (Result scannerResult: scanner) {
  51.                 System.out.println("Scan: " + scannerResult);
  52.                 byte[] row = scannerResult.getRow();
  53.                 System.out.println("rowName:" + new String(row,"utf-8"));
  54.                 }
  55.             } finally {
  56.                 scanner.close();
  57.             }
  58.         }finally{
  59.             table.close();
  60.         }
  61.         
  62.          
  63.           /********* End *********/
  64.   }
  65.  
  66. }
  67. //连接HBase
  68.             Configuration config = HBaseConfiguration.create();
  69.             Connection connection = ConnectionFactory.createConnection(config);//config为前文的配置对象
  70.             Admin admin = connection.getAdmin();//使用连接对象获取Admin对象
  71. //获取表    
  72.             TableName tableName = TableName.valueOf("t_step3"); //定义表名
  73.             Table table = connection.getTable(tableName);//获取Table对象
  74.         
  75. //获取数据
  76.             Get get new Get(Bytes.toBytes("row1"));    //定义get对象
  77.             Result result = table.get(get);            //通过table对象获取数据
  78.             System.out.println("Result: " + result);
  79.             //很多时候我们只需要获取” 这里表示获取 data:1 列族的值
  80.             byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); //获取到的是字节数组
  81.         
  82. //将字节转成字符串
  83.             String valueStr new String(valueBytes,"utf-8");
  84.             System.out.println("value:" + valueStr);
  85.         
  86.             TableName tableStep3Name = TableName.valueOf("table_step3");
  87.             Table step3Table = connection.getTable(tableStep3Name);
  88. //批量查询
  89.             Scan scan new Scan();
  90.             ResultScanner scanner = table.getScanner(scan);
  91.             try {
  92.                 for (Result scannerResult: scanner) {
  93.                 System.out.println("Scan: " + scannerResult);
  94.                 byte[] row = scannerResult.getRow();
  95.                 System.out.println("rowName:" + new String(row,"utf-8"));
  96.                 }
  97.             } finally {
  98.                 scanner.close();
  99.             }
  100.         }finally{
  101.             ;
  102.         }
  103.         
  104.         /********* End *********/

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于在HBase数据库使用Java创建表的方法如下: 首先,需要导入HBaseJava API相关的包: ```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.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.io.compress.CompressionAlgorithm; import org.apache.hadoop.hbase.regionserver.BloomType; import org.apache.hadoop.hbase.util.Bytes; ``` 然后,通过以下代码建立与HBase数据库连接: ```java Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); Connection connection = ConnectionFactory.createConnection(config); Admin admin = connection.getAdmin(); ``` 其中,"localhost"为HBase数据库所在的主机名。接下来,可以使用以下代码创建表: ```java String tableName = "myTable"; TableName name = TableName.valueOf(tableName); TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(name) .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf")) .setCompressionType(CompressionAlgorithm.GZ) .setBloomFilterType(BloomType.ROWCOL) .build()) .build(); admin.createTable(tableDescriptor); ``` 这里创建了一个名为"myTable"的表,并设置了一个名为"cf"的列族,其中设置了压缩算法和Bloom过滤器类型。最后,使用admin.createTable()方法创建表。 需要注意的是,在使用完后需要关闭与HBase数据库连接: ```java admin.close(); connection.close(); ``` 以上就是使用JavaHBase数据库中创建表的方法,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值