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

news/2024/11/8 10:05:16 标签: hadoop, 大数据, hdfs

实践二  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.niftyadmin.cn/n/5743719.html

相关文章

前端八股文(一)HTML 持续更新中。。。

html常见八股 1.src和href的区别? src: 用于js脚本,img、iframe、script等标签 加载时会阻塞主线程,将资源内容嵌入到当前标签所在的位置,将其指向的资源下载应用到文档内 href: 用于链接a、link等标签…

react->Antd->Table调整checkbox默认样式

checkbox默认不展示,hover此行时,出现checkbox,选中后不消失: hover前,设置透明边框; hover时,checkbox出现 选中后 代码块: .ant-checkbox {.ant-checkbox-inner {border: transparent;}}.ant…

基于YOLOv8 Web的安全帽佩戴识别检测系统的研究和设计,数据集+训练结果+Web源码

摘要 在工地,制造工厂,发电厂等地方,施工人佩戴安全帽能有效降低事故发生概率,在工业制造、发电等领域需要进行施工人员安全帽监测。目前大多数的 YOLO 模型还拘泥于公司、企业开发生产的具体产品中,大多数无编程基础…

DeFi 4.0峥嵘初现:主权金融时代的来临

近年来,Web3领域的创新似乎遇到了瓶颈,DeFi(去中心化金融)从热潮的巅峰逐渐进入了一个沉寂期。我们再也没有见到像DeFi Summer那样的行业兴奋,资本市场的动荡和Meme币的出现,似乎让人们忘记了曾经的区块链技…

解析Eureka的架构

1. 引言 1.1 Eureka的定义与背景 Eureka是由Netflix开发的一个RESTful服务,用于服务发现。它是微服务架构中的一个核心组件,主要用于管理服务的注册和发现。Eureka允许服务提供者注册自己的服务信息,同时也允许服务消费者查询可用的服务&am…

【AI技术】PaddleSpeech

【AI技术】PaddleSpeech 技术介绍优点缺点 部署基础环境的搭建分步详解国内镜像源切换所需环境1 g所需环境2 vim所需环境3 cuda所需环境4 cudnn所需环境5 ssl源码拉取PaddleSpeech环境安装 部署文件分享DockerHub 技术介绍 PaddleSpeech是飞浆平台的一款TTS框架。 优点 开源…

线路管网的可视化大屏,能够加载轻易感知不到的数据。

线路管网的可视化大屏具有独特的优势。它能够将通常轻易感知不到的数据清晰地呈现出来。通过直观的图表、图像和动态效果,展示管网的布局、流量、压力等信息。 色彩的运用可以区分不同的管线和状态,便于快速识别问题区域。借助可视化大屏,工…

MATLAB 在数组的元素后面使用百分号 `%` 添加注释时会将其误认为是行分隔符,导致数组维度不一致

该警告提示 MATLAB 在数组的元素后面使用百分号 % 添加注释时会将其误认为是行分隔符,导致数组维度不一致。为了解决这个问题,您可以采用以下两种方法之一: 使用分号 ; 替换逗号 ,:这会将每个注释作为新行的开始,更加…