hadoop技术实验- 第4章 HBase 开辟:利用Java操作HBase

张春  金牌会员 | 2024-12-13 08:54:51 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

相关知识
为了完本钱关任务,你需要把握:1.如何利用Java毗连HBase数据库,2.如何利用Java代码在HBase中创建表。


如何利用Java毗连HBase数据库
Java毗连HBase需要两个类:
HBaseConfiguration
ConnectionFactory
HBaseConfiguration
要毗连HBase我们起首需要创建Configuration对象,这个对象我们需要通过HBaseConfiguration(HBase设置)对象来举行创建,HBaseConfiguration看名字我们就能猜到它的用途:读取指定路径下hbase-site.xml和hbase-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对象,然后让它来创建一张表:
  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,创建表关键代码如下:
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版本,以是两种都可用)。
编程要求

利用本关知识,在右侧编辑器begin-end处增补代码,请你编写一个Java步伐,在HBase中创建表tb_step2,列簇都为:data,添加数据:
行号分别为:row1,row2;
列名分别为:1,2;
值分别为:张三丰,张无忌。
代码编写


  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(); //使用create()静态方法就可以得到Configuration对象
  26.         Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象
  27.                 Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
  28.         TableName tableName = TableName.valueOf("tb_step2");//定义表名
  29. //TableDescriptor对象通过TableDescriptorBuilder构建;
  30.         TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
  31.         ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
  32.         tableDescriptor.setColumnFamily(family);//设置列族
  33.         admin.createTable(tableDescriptor.build());//创建表
  34.         Table table = connection.getTable(tableName);//获取Table对象
  35.         try {
  36.             byte[] row = Bytes.toBytes("row1");    //定义行
  37.             Put put = new Put(row);                //创建Put对象
  38.             byte[] columnFamily = Bytes.toBytes("data");    //列簇
  39.             byte[] qualifier = Bytes.toBytes(String.valueOf(1)); //列
  40.             byte[] value = Bytes.toBytes("张三丰");    //值
  41.             put.addColumn(columnFamily, qualifier, value);
  42.             table.put(put);        //向表中添加数据
  43.             row = Bytes.toBytes("row2");    //定义行
  44.             put = new Put(row);                //创建Put对象
  45.             columnFamily = Bytes.toBytes("data");    //列簇
  46.             qualifier = Bytes.toBytes(String.valueOf(2)); //列
  47.             value = Bytes.toBytes("张无忌");    //值
  48.             put.addColumn(columnFamily, qualifier, value);
  49.             table.put(put);        //向表中添加数据
  50.         } finally {
  51.             //使用完了要释放资源
  52.             table.close();
  53.         }
  54.                 /********* End *********/
  55.         }
  56. }
复制代码
第3关:获取数据

任务形貌
本关任务:获取HBase中已存在表的数据并输出。


相关知识
为了完本钱关任务,你需要把握:1.如何利用Get对象获取数据,2.如何利用Scan批量输出表中的数据。


获取指定行的数据
我们利用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);
复制代码
扫描表中的数据
只获取一行数据显然不能满足我们全部的需求,我们想要获取表中全部的数据应该怎么操作呢?


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

  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. package step3;
  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 queryTableInfo()throws Exception{
  24.                 /********* Begin *********/
  25.                  Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
  26.         Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象
  27.                 Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
  28.         TableName tableName = TableName.valueOf("t_step3");//定义表名
  29.         Table table = connection.getTable(tableName);//获取Table对象
  30.         Get get = new Get(Bytes.toBytes("row1"));    //定义get对象
  31.         Result result = table.get(get);            //通过table对象获取数据
  32.         // System.out.println("Result: " + result);
  33.         //很多时候我们只需要获取“值” 这里表示获取 data:1 列族的值
  34.         byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); //获取到的是字节数组
  35.         //将字节转成字符串
  36.         String valueStr = new String(valueBytes,"utf-8");
  37.         System.out.println("value:" + valueStr);
  38.         /**
  39.             这里是批量显示,换表了
  40.         */
  41.         tableName = TableName.valueOf("table_step3");//定义表名
  42.         table = connection.getTable(tableName);//获取Table对象
  43.         Scan scan = new Scan();
  44.         ResultScanner scanner = table.getScanner(scan);
  45.         try {
  46.             for (Result scannerResult: scanner) {
  47.                 // System.out.println("Scan: " + scannerResult);
  48.                 byte[] row = scannerResult.getRow();
  49.                 System.out.println("rowName:" + new String(row,"utf-8"));
  50.             }
  51.         } finally {
  52.             scanner.close();
  53.                        
  54.             }
  55.                
  56.                
  57.                
  58.                 /********* End *********/
  59.         }
  60.        
  61. }
复制代码

第4关:删除表

任务形貌
本关任务:删除表。


相关知识
本次关卡我们来学习本次实训最后一个内容,删除表。


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

代码很简单:
  1. TableName tableName = TableName.valueOf("test");
  2. admin.disableTable(tableName);    //禁用表
  3. admin.deleteTable(tableName);    //删除表
复制代码

 代码
  1. package step4;
  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.        
  25.         public void deleteTable()throws Exception{
  26.                 /********* Begin *********/
  27.          Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
  28.         Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象
  29.                 Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
  30.         TableName tableName = TableName.valueOf("t_step4");
  31.         admin.disableTable(tableName);    //禁用表
  32.         admin.deleteTable(tableName);    //删除表
  33.                
  34.                
  35.                 /********* End *********/
  36.         }
  37. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表