【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列族下没有子列所以第四个参数为空):

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理&#xff1a;输入测试文本为herf的属性值和内容值&#xff0c;所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…

【数据分享】1901-2023年我国省市县镇四级的逐年降水数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月降水栅格数据和Shp和Excel格式的省市县四级逐月降水数据&#xff0c;原始的逐月降水栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年累计值的方法得到逐年降水栅格数据&#…

Istio Gateway发布服务

1. Istio Gateway发布服务 在集群中部署一个 tomcat 应用程序。然后将部署一个 Gateway 资源和一个与 Gateway 绑定的 VirtualService&#xff0c;以便在外部 IP 地址上公开该应用程序。 1.1 部署 Gateway 资源 vim ingressgateway.yaml --- apiVersion: networking.istio.…

暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费

暮雨直播是一款内置直播源的电视直播应用程序&#xff0c;提供丰富的频道内容&#xff0c;包括教学、首页、一线、博主、解说、动漫、堆堆等。该应用的内置直播源持续更新维护&#xff0c;确保用户可以稳定地观看各种电视频道。暮雨直播承诺永久免费&#xff0c;为用户提供了一…

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区&#xff0c;只是默认开窗存储&#xff1b; 分区是按行&#xff0c;如一百行数据&#xff0c;按十位上的数字分区&#xff0c;则有十个分区&#xff0c;每个分区里有十行&#xff1b; 分桶是根据某个字段哈希对桶数取…

Java基于SpringBoot+Vue框架的宠物寄养系统(V2.0),附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

定义宏将整数的二进制的奇数位和偶数位互换位置

假设这个数为n00000000 00000000 00000000 00001101——13 1.思路 1.1 奇数位&#xff1a;00000000 00000000 00000000 00000101 但是怎么获得奇数位呢&#xff1f;——进行按位与运算 不懂如何运算的可以看我主页的详解操作符-CSDN博客&#xff0c;该章详细写了各个操作符如何…

基于 RNN 的语言模型

基于 RNN 的语言模型 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类网络连接中包含环路的 神经网络的总称。 给定一个序列&#xff0c;RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度&#xff0c;历史状态被循环累积&#xff0c;并作为…

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日)

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日) <input type"week" id"week" class"my-css" value"ViewBag.DefaultWeek" /><script> function PageList() { var dateStrin…

C/C++--11--Vxworks6.8 + workbench3.2-一文看懂安装及工程导入说明

1、安装包截图如下&#xff1a; 2、安装流程如下&#xff1a; 安装系统&#xff1a;Win10-64位&#xff08;会出现以下报错-待解决&#xff09; 安装系统&#xff1a;Win7-64位&#xff0c;安装成功&#xff0c;路径如下&#xff1a; http://www.windriver.com/ 1、安装完成后…

MLMs之OmniGen:OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略

MLMs之OmniGen&#xff1a;OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;这篇论文介绍了OmniGen&#xff0c;一个用于统一图像生成的扩散模型。论文的核心要点可以总结如下&#xff1a; >> 背景痛点&#xff1a; ● 图像生成领…

QT中 update()函数无法实时调用 paintEvent

QT中 update()函数无法实时调用 paintEvent&#xff01; 在QT中&#xff0c;update()函数用于标记一个窗口区域为“需要重绘”。当调用update()后&#xff0c;QT会在合适的时候调用paintEvent()来重绘这个区域。然而&#xff0c;update()不会立即调用paintEvent()&#xff0c;…

OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法&#xff0c;特别适用于目标跟踪、图像分割等任务。该算…

无人车之路径规划篇

无人车的路径规划是指在一定的环境模型基础上&#xff0c;给定无人车起始点和目标点后&#xff0c;按照性能指标规划出一条无碰撞、能安全到达目标点的有效路径。 一、路径规划的重要性 路径规划对于无人车的安全、高效运行至关重要。它不仅能够提高交通效率&#xff0c;减少交…

杂谈:业务说的场景金融是什么?

引言&#xff1a;市场格局的转变 在供应短缺的年代&#xff0c;是典型的卖方市场。为了保证稳定供货&#xff0c;买方会提前一段时间下单&#xff0c;也几乎没什么议价能力。卖方只需等着接单就行。 现在很多领域的供应商数量越来越多&#xff0c;而且随着互联网的普及&#…

Chrome扩展是程序员做独立开发的绝佳入场机会

一、开发成本低&#xff0c;难度低 简便灵活&#xff1a;相比开发移动应用&#xff0c;浏览器扩展的开发过程更加简便灵活&#xff0c;更适合初学者。省时省力&#xff1a;通过扩展&#xff0c;你可以修改现有网站的功能&#xff0c;无需从零开始搭建应用&#xff0c;大大节省…

Aop+自定义注解实现数据字典映射

数据字典 Web项目开发中&#xff0c;字典表的一般都会存在&#xff0c;主要用来给整个系统提供基础服务。 比如男女性别的类型可以使用0和1来进行表示&#xff0c;在存储数据和查询数据的时候&#xff0c;就可以使用字典表中的数据进行翻译处理。 再比如之前做的一个项目中宠物…

【C#】选课程序增加、删除统计学时

文章目录 【例6-2】编写选课程序。利用利用列表框和组合框增加和删除相关课程&#xff0c;并统计学时数1. 表6-2 属性设置2. 设计窗体及页面3. 代码实现4. 运行效果 【例6-2】编写选课程序。利用利用列表框和组合框增加和删除相关课程&#xff0c;并统计学时数 分析&#xff1…

星期-时间范围选择器 滑动选择时间 最小粒度 vue3

星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例根据业务需要,实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段,并且可以通过快速选择组件来快速选择特定的时间范围。 功能介绍 时间范围选择:用户可以通过鼠标拖动来选择时间段。快速选…

Swift从0开始学习 简单值 day1

1.0简单值的初始化: Swift声明值可以使用let 来声明常量&#xff0c;使用 var 来声明变量。let声明是不可修改的且只能赋值一次&#xff0c;var声明是可修改的。两者都不需要显式的指定类型&#xff0c;当你通过一个值来声明变量和常量时&#xff0c;编译器会自动推断其类型。 …