当前位置: 首页 > article >正文

【hdfs】【hbase】【大数据技术基础】实践二 HBase Java API编程

实践二  HBase Java API编程

为什么可以写命令还要编写程序?自动化批量处理?

        尽管我们可以通过HBase的shell命令行工具进行数据操作,但在实际的生产环境中,为了提高效率和实现自动化处理,我们通常需要编写程序来与HBase进行交互。

        本实例使用Eclipse编写java程序,来对HBase数据库进行增删改查等操作,Eclipse可以在Ubuntu软件中心搜索下载并安装。

第一步:启动hadoop,启动hbase

        在开始之前,确保你已经安装了Hadoop和HBase,并且它们正在运行。你可以通过以下命令启动它们:

  1. cd /usr/local/hadoop
  2. ./sbin/start-dfs.sh
  3. cd /usr/local/hbase
  4. ./bin/start-hbase.sh

HBase 命令要在HBase shell中使用

启动 HBase shell: 在命令行中输入以下命令来启动 HBase shell:

hbase shell

        如果 HBase 服务启动成功,你将看到 HBase shell 的提示符,通常是一个光标后面跟着 hbase>

HBase命令使用:使用scan ‘Score’,示例:

:因为我们表还没被创建,报错Unknown table Score是正常的。

报错了可能因为少了:ssh localhost

这个命令可不能少!使用SSH登录本地主机,确保HBase Shell可以正常访问。

第二步,新建Java Project——>新建Class


第三步:在工程中导入外部jar包:

首先导入前面的HDFS API相应类包(实践一中导入的)。
然后导入hbase安装目录中的lib文件中的所有jar包。


下列代码包含了数据库创建、增删改查等一系列操作,需要大家根据需要逐步开放注释,进行分阶段运行。
这里给出一个编程实例,,以下是源代码:

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.hbase.*;
  3. import org.apache.hadoop.hbase.client.*;
  4. import java.io.IOException;
  5. public class ExampleForHbase{
  6.     public static Configuration configuration;
  7.     public static Connection connection;
  8.     public static Admin admin;
  9.     //主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释
  10.     public static void main(String[] args)throws IOException{
  11.         //创建一个表,表名为Score,列族为sname,course
  12.         createTable("Score",new String[]{"sname","course"});
  13.         //在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空)
  14.         //等价命令:put 'Score','95001','sname','Mary'
  15.         //insertRow("Score", "95001", "sname", "", "Mary");
  16.         //在Score表中插入一条数据,其行键为95001,course:Math为88(course为列族,Math为course下的子列)
  17.         //等价命令:put 'Score','95001','score:Math','88'
  18.         //insertRow("Score", "95001", "course", "Math", "88");
  19.         //在Score表中插入一条数据,其行键为95001,course:English为85(course为列族,English为course下的子列)
  20.         //等价命令:put 'Score','95001','score:English','85'
  21.         //insertRow("Score", "95001", "course", "English", "85");
  22.         //1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math
  23.         //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释
  24.         //等价命令:delete 'Score','95001','score:Math'
  25.         //deleteRow("Score", "95001", "course", "Math");
  26.         //2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除)
  27.         //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释
  28.         //等价命令:delete 'Score','95001','score'
  29.         //deleteRow("Score", "95001", "course", "");
  30.         //3、删除Score表中指定行数据,其行键为95001
  31.         //执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释
  32.         //等价命令:deleteall 'Score','95001'
  33.         //deleteRow("Score", "95001", "", "");
  34.         //查询Score表中,行键为95001,列族为course,列为Math的值
  35.         //getData("Score", "95001", "course", "Math");

  1.         //查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空)
  2.         //getData("Score", "95001", "sname", "");
  3.         //删除Score表
  4.         //deleteTable("Score");
  5.     }
  6.     //建立连接
  7.     public static void init(){
  8.         configuration  = HBaseConfiguration.create();
  9.         configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
  10.         try{
  11.             connection= ConnectionFactory.createConnection(configuration);
  12.             admin = connection.getAdmin();
  13.         }catch (IOException e){
  14.             e.printStackTrace();
  15.         }
  16.     }
  17.     //关闭连接
  18.     public static void close(){
  19.         try{
  20.             if(admin != null){
  21.                 admin.close();
  22.             }
  23.             if(null != connection){
  24.                 connection.close();
  25.             }
  26.         }catch (IOException e){
  27.             e.printStackTrace();
  28.         }
  29.     }
  30.     /**
  31.      * 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
  32.      * @param myTableName 表名
  33.      * @param colFamily 列族名
  34.      * @throws IOException
  35.      */
  36.     public static void createTable(String myTableName,String[] colFamily) throws IOException {
  37.         init();
  38.         TableName tableName = TableName.valueOf(myTableName);
  39.         if(admin.tableExists(tableName)){
  40.             System.out.println("talbe is exists!");
  41.         }else {
  42.             HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
  43.             for(String str:colFamily){
  44.                 HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
  45.                 hTableDescriptor.addFamily(hColumnDescriptor);
  46.             }
  47.             admin.createTable(hTableDescriptor);
  48.             System.out.println("create table success");
  49.         }
  50.         close();
  51.     }
  52.     /**
  53.      * 删除指定表
  54.      * @param tableName 表名
  55.      * @throws IOException
  56.      */
  57.     public static void deleteTable(String tableName) throws IOException {
  58.         init();
  59.         TableName tn = TableName.valueOf(tableName);
  60.         if (admin.tableExists(tn)) {
  61.             admin.disableTable(tn);
  62.             admin.deleteTable(tn);
  63.         }
  64.         close();
  65.     }
  66.     /**
  67.      * 查看已有表
  68.      * @throws IOException
  69.      */
  70.     public static void listTables() throws IOException {
  71.         init();
  72.         HTableDescriptor hTableDescriptors[] = admin.listTables();
  73.         for(HTableDescriptor hTableDescriptor :hTableDescriptors){
  74.             System.out.println(hTableDescriptor.getNameAsString());
  75.         }
  76.         close();
  77.     }
  78.     /**
  79.      * 向某一行的某一列插入数据
  80.      * @param tableName 表名
  81.      * @param rowKey 行键
  82.      * @param colFamily 列族名
  83.      * @param col 列名(如果其列族下没有子列,此参数可为空)
  84.      * @param val 值
  85.      * @throws IOException
  86.      */
  87.     public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
  88.         init();
  89.         Table table = connection.getTable(TableName.valueOf(tableName));
  90.         Put put = new Put(rowKey.getBytes());
  91.         put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
  92.         table.put(put);
  93.         table.close();
  94.         close();
  95.     }
  96.     /**
  97.      * 删除数据
  98.      * @param tableName 表名
  99.      * @param rowKey 行键
  100.      * @param colFamily 列族名
  101.      * @param col 列名
  102.      * @throws IOException
  103.      */
  104.     public static void deleteRow(String tableName,String rowKey,String colFamily,String col) throws IOException {
  105.         init();
  106.         Table table = connection.getTable(TableName.valueOf(tableName));
  107.         Delete delete = new Delete(rowKey.getBytes());
  108.         //删除指定列族的所有数据
  109.         //delete.addFamily(colFamily.getBytes());
  110.         //删除指定列的数据
  111.         //delete.addColumn(colFamily.getBytes(), col.getBytes());

这里应该是:

    if (col != null && !col.isEmpty()) {

        // 如果有 col 参数传入,则删除指定列

        delete.addColumn(colFamily.getBytes(), col.getBytes());

    } else if(colFamily != null && !colFamily.isEmpty()) {

        // 否则,删除指定列族的所有数据

        delete.addFamily(colFamily.getBytes());

    }

  1.         table.delete(delete);
  2.         table.close();
  3.         close();
  4.     }
  5.     /**
  6.      * 根据行键rowkey查找数据
  7.      * @param tableName 表名
  8.      * @param rowKey 行键
  9.      * @param colFamily 列族名
  10.      * @param col 列名
  11.      * @throws IOException
  12.      */
  13.     public static void getData(String tableName,String rowKey,String colFamily,String col)throws  IOException{
  14.         init();
  15.         Table table = connection.getTable(TableName.valueOf(tableName));
  16.         Get get = new Get(rowKey.getBytes());
  17.         get.addColumn(colFamily.getBytes(),col.getBytes());
  18.         Result result = table.get(get);
  19.         showCell(result);
  20.         table.close();
  21.         close();
  22.     }
  23.     /**
  24.      * 格式化输出
  25.      * @param result
  26.      */
  27.     public static void showCell(Result result){
  28.         Cell[] cells = result.rawCells();
  29.         for(Cell cell:cells){
  30.             System.out.println("RowName:"+new String(CellUtil.cloneRow(cell))+" ");
  31.             System.out.println("Timetamp:"+cell.getTimestamp()+" ");
  32.             System.out.println("column Family:"+new String(CellUtil.cloneFamily(cell))+" ");
  33.             System.out.println("row Name:"+new String(CellUtil.cloneQualifier(cell))+" ");
  34.             System.out.println("value:"+new String(CellUtil.cloneValue(cell))+" ");
  35.         }
  36.     }
  37. }

第四步:执行与验证

        每次执行完,都可以回到shell界面查看是否执行成功,如:执行完插入数据后,在shell界面中执行scan 'Score'。截图如下:
 

建表:

建表成功~

添加数据:

删除指定列:

删除指定列族:

删除整行数据:

查询Score表中,行键为95001,列族为course,列为Math的值:

查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空):

 【遇到的问题】:为什么打印了内存地址而不是值

【解决方法】:把+" "删除就好了?


http://www.kler.cn/a/385868.html

相关文章:

  • 量化交易系统开发-实时行情自动化交易-3.4.3.3.期货市场深度数据
  • 深度学习:transpose_qkv()与transpose_output()
  • 数据研发基础 | 什么是流批一体
  • hive alter table add columns 是否使用 cascade 的方案
  • 云计算复习文档
  • 【C++】list 与 string 基础与实现字符串操作
  • 2024 CSS - 保姆级系列教程三 - 选择器与布局详解
  • 【MySQL】——数据库恢复技术
  • 数仓工具—Hive语法之窗口函数窗口范围/边界 range between和rows between
  • 黑马程序员Redis学习【持续更新】
  • 数据发生变化时(DOM)视图没有更新的原因及解决方案 - 2024最新版前端秋招面试短期突击面试题【100道】
  • 移动应用开发项目——图书影片管理系统【安卓项目|前后端】
  • Ubuntu /etc/sudo.conf is owned by uid 1000, should be 0 的一种解决方法
  • 掌握 .NET 8 中最小 API 的单元和集成测试:高质量代码的最佳实践
  • CTF —— 网络安全大赛
  • ABAP开发-12、Dialog屏幕开发_1
  • 设计模式-构建者
  • IO作业day4
  • redis:list列表命令和内部编码
  • jenkins使用slave节点进行node打包报错问题处理
  • 【JAVA毕业设计】基于Vue和SpringBoot的技术交流分享平台
  • C++ 游戏开发:打造高效、性能优越的游戏世界
  • 【观察】华为持续投入开源开放“结硕果”,openEuler走出操作系统“创新路”...
  • 怎么对 PDF 添加权限密码或者修改密码-免费软件分享
  • .NET中通过C#实现Excel与DataTable的数据互转
  • Docker使用相关记录