Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据)

article/2025/10/11 6:51:09

目录

      • 直接在main函数中执行语句
      • 借助@Test来运行方法
        • 删除表
        • 修改表结构
        • 列出来所有的表
        • 插入一条数据
        • 获取一行数据
        • 创建表
        • 批量读取文件中的数据,并且批量插入表中
        • 获取一组数据的值
        • 利用CellUtil改善读取数据方式

导入依赖

 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.4.6</version></dependency>

直接在main函数中执行语句

需求:在hbase中创建一张表testAPI,有一个列簇cf1,并且修改列簇cf1的versions属性值为3

package Demo.hbase;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
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 java.io.IOException;public class demo1 {public static void main(String[] args) throws IOException {//1.创建一个配置文件,根据这个配置文件来决定怎么连接到hbase数据库Configuration conf = HBaseConfiguration.create();//配置ZK的地址,通过ZK可以找到Hbase//Hbase的元数据信息都存放在ZK里面,因此要操作Hbase,需要给出的是ZK的地址//"hbase.zookeeper.quorum"来自安装hbase时配置的hbase-site.xml里面的配置信息conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");//2.根据上面的配置文件创建连接Connection conn = ConnectionFactory.createConnection(conf);//3.如果需要对表结构操作,则getAdmin//         对数据进行操作,则getTableAdmin admin = conn.getAdmin();//创建testAPI表,并指定一个列簇cf1,并将cf1的版本设置为3/*** 这里的思路应该是,首先要通过admin.createTable()语句建表,但是建表需要表的信息* 因此通过new HTableDescriptor的方式获取表的信息,但是HTableDescriptor创建完成后里面没有列簇的信息* 因此又通过new HColumnDescriptor的方式建立列簇的相关信息* 而列簇的具体属性配置等,有专门的方法,比如这里的setMaxVersions** 这样一环套一环,修改列簇属性,将修改后的列簇信息放入表信息* 最后admin.createTable(testAPI)利用表信息创建表*///HTableDescriptor包含了表的名字及其对应表的列族HTableDescriptor testAPI = new HTableDescriptor(TableName.valueOf("testAPI"));//创建一个列簇//HColumnDescriptor维护着关于列族的信息,例如版本号,压缩设置等HColumnDescriptor cf1 = new HColumnDescriptor("cf1");//对列簇进行配置cf1.setMaxVersions(3);//给testAPI表增加一个列簇testAPI.addFamily(cf1);//创建testAPI表admin.createTable(testAPI);//用完后关闭连接admin.close();conn.close();}
}

在这里插入图片描述
在这里插入图片描述
创建成功

借助@Test来运行方法

由于要写的方法太多,因此这里使用Junit框架,利用@Test来执行语句

首先给出要导入的全部jar包,以及 @Before 和 @After 方法,之后的所有方法都在这两个方法里面。这样每个@Test方法执行之前都会先执行@Before方法,执行完成之后都会自动执行@After方法

package Demo.hbase;import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class demo2 {Connection conn;Admin admin;@Beforepublic void createConn() throws IOException {// 1、创建一个配置文件Configuration conf = HBaseConfiguration.create();// 配置ZK的地址,通过ZK可以找到HBaseconf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");// 2、创建连接conn = ConnectionFactory.createConnection(conf);// 3、创建Admin对象admin = conn.getAdmin();}@Afterpublic void close() throws IOException {admin.close();conn.close();}
}

删除表

@Test//drop tablepublic void dropTable() throws IOException{TableName test2 = TableName.valueOf("test2");//判断表是否存在if(admin.tableExists(test2)){//在删除表之前要先禁用表admin.disableTable(test2);admin.deleteTable(test2);}}

结果为

hbase(main):002:0> list=> ["test", "test1", "test2", "testAPI"]hbase(main):004:0> list=> ["test", "test1", "testAPI"]

修改表结构

@Test//修改表结构//针对test表,将info列簇的ttl设置为10000,并增加一个新的列簇cf1public void modifyTable() throws IOException{TableName test = TableName.valueOf("test");//获取表原有的结构HTableDescriptor tableDescriptor = admin.getTableDescriptor(test);//在表原有的结构中,修改列簇的属性//获取test表中全部的列簇HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();//遍历表中的原有的全部列簇for (HColumnDescriptor c : columnFamilies) {//找到需要修改的列簇infoif("info".equals(c.getNameAsString())){c.setTimeToLive(10000);}}//新增一个列簇//要要新增一个列簇就需要在表信息test里面增加新列簇的信息//因此先创建新列簇的信息HColumnDescriptor cf1 = new HColumnDescriptor("cf1");//将cf1添加到表信息中tableDescriptor.addFamily(cf1);//根据修改后表信息admin.modifyTable(test,tableDescriptor);}

结果为
在这里插入图片描述

列出来所有的表

 @Test//列出来所有的表public void listTable() throws IOException{TableName[] tableNames = admin.listTableNames();for (TableName tableName : tableNames) {System.out.println(tableName.getNameAsString());}}

结果为
在这里插入图片描述

插入一条数据

@Test//插入数据public void put() throws IOException{//之前修改表结构用的都是 getAdmin//这里要修改的是数据,因此用的是 getTableTable testAPI = conn.getTable(TableName.valueOf("testAPI"));//同样插入数据也需要对应的对象信息,这里是put//要想插入一条数据,需要rowkey和value,这里在创建put对象时指定rowkey//注意使用getBytes()转换为字节数组的形式Put put = new Put("0001".getBytes());//接下来获取要插入的value值//addColumn括号里面的参数从左到右依次为列簇,列名,具体的值put.addColumn("cf1".getBytes(),"name".getBytes(),"zhang".getBytes());//利用put对象信息插入数据testAPI.put(put);}

结果为

hbase(main):003:0> scan 'testAPI'
ROW                                                   COLUMN+CELL                                                                                                                                                
0 row(s) in 0.0100 secondshbase(main):004:0> scan 'testAPI'
ROW                                                   COLUMN+CELL                                                                                                                                                0001                                                 column=cf1:name, timestamp=1638286764676, value=zhang                                                                                                      
1 row(s) in 0.0220 seconds

获取一行数据

 @Test//获取数据public void get() throws IOException{Table testAPI = conn.getTable(TableName.valueOf("testAPI"));Get get = new Get("0001".getBytes());//利用get对象信息获取对应的结果resultResult result = testAPI.get(get);//获取rowkeybyte[] row = result.getRow();//row的类型是字节数组,所以应该借助Bytes转换成字符串输出System.out.println(Bytes.toString(row));//获取cellbyte[] name = result.getValue("cf1".getBytes(), "name".getBytes());System.out.println(Bytes.toString(name));}

结果为
在这里插入图片描述

创建表

@Test//创建表public void createTable() throws IOException{//表信息 studentHTableDescriptor student = new HTableDescriptor(TableName.valueOf("student"));//列簇信息 infoHColumnDescriptor info = new HColumnDescriptor("info");//将列簇信息info加入到表信息student里面student.addFamily(info);//根据表信息student建表admin.createTable(student);}

结果为

hbase(main):006:0> list=> ["student", "test", "test1", "testAPI"]

批量读取文件中的数据,并且批量插入表中

 @Test//读取学生的全部信息并写入之前创建的student表中public void putAll() throws IOException{//读取学生信息BufferedReader br = new BufferedReader(new FileReader("data/students.txt"));//与hbase里面的student表建立连接Table student = conn.getTable(TableName.valueOf("student"));String line = null;//创建put的集合,用于批量插入数据,避免每次循环都执行一次put语句ArrayList<Put> puts = new ArrayList<>();int batchSize = 11;while((line=br.readLine())!=null){//写入hbase里面的student表String[] split = line.split(",");String id = split[0];String name = split[1];String age = split[2];String gender = split[3];String clazz = split[4];//往put对象里面放入rowkeyPut put = new Put(id.getBytes());//往put对象里面放入value//addColumn()括号里面的参数依次是列簇,列名,值byte[] info = "info".getBytes();put.addColumn(info,"name".getBytes(),name.getBytes());put.addColumn(info,"age".getBytes(),age.getBytes());put.addColumn(info,"gender".getBytes(),gender.getBytes());put.addColumn(info,"clazz".getBytes(),clazz.getBytes());//批量执行,将当前循环的新的put对象放入puts集合中puts.add(put);//当puts集合的大小和之前设定的batchSize大小一致时//利用getTable获取的student对象来调用put方法,将puts里面的数据写入student表//注意不要混淆,利用put方法,将puts集合中的多个put对象的数据写入student表if(puts.size() == batchSize){student.put(puts);//集合里面的数据都写入完后,清空集合,准备迎接下一批次的数据puts.clear();}}System.out.println(puts.isEmpty());System.out.println(puts.size());//这里还要注意一件事情,那就是students文件的数据总数是batchSize的整数倍时才能全部写入//否则会有几条语句因为不满batchSize的大小,没有触发student的put方法//因此在这里再加上一个判断,如果还有几条数据没有写入,那么写入if(!puts.isEmpty()){student.put(puts);}//关闭brbr.close();}

结果为
在这里插入图片描述
这里的false说明还有几条数据没有被写入student表中,因为数据数量没有达到batchSize的值
下面的10,说明是每10条数据触发一次写入,即一次性写入十条数据进入student表中

结果为

hbase(main):008:0> count 'student'
Current count: 1000, row: 1500101000                                                                                                                                                                             
1000 row(s) in 0.6270 seconds=> 1000

总共一千条数据,写入成功

获取一组数据的值

@Test//获取一组数据//利用scan读取student表里面的全部数据public void scanStudent() throws IOException{Table student = conn.getTable(TableName.valueOf("student"));//设置scan对象信息,指定扫描范围,有两种方法Scan scan = new Scan();//方法一,限制rowkey的值,左开右闭,【startRow,stopRow)scan.withStartRow("1500100100".getBytes());scan.withStopRow("1500100111".getBytes());//方法二,限制返回的条数scan.setLimit(10);//利用student对象调用getScanner方法,具体的扫描信息来源自上面定义的scan对象for (Result result : student.getScanner(scan)) {String id = Bytes.toString(result.getRow());String name = Bytes.toString(result.getValue("info".getBytes(),"name".getBytes()));String age = Bytes.toString(result.getValue("info".getBytes(),"age".getBytes()));String gender = Bytes.toString(result.getValue("info".getBytes(),"gender".getBytes()));String clazz = Bytes.toString(result.getValue("info".getBytes(),"clazz".getBytes()));//输出打印扫描到的每一行的数据System.out.println(id+","+name+","+age+","+gender+","+clazz);}}

结果为
在这里插入图片描述

利用CellUtil改善读取数据方式

 @Test//利用CellUtil获取一行数据的全部单元格里面的值//向上面那个方法一个一个指定列名不仅麻烦,而且如果哪一行的列名不一致,又会读取null或者读取不到//因此使用listCells + CellUtil,可以不用考虑每条数据的结构public void scanWithCellUtil() throws IOException{Table student = conn.getTable(TableName.valueOf("student"));//给scan增加扫描范围限制,这次只扫描最后十行Scan scan = new Scan();scan.withStartRow("1500100990".getBytes());//利用scan获取一组数据for (Result result : student.getScanner(scan)) {//获取rowkeyString id = Bytes.toString(result.getRow());System.out.print(id+" "); //注意使用print,让rowkey和value在同一行//利用listCells将一行数据的全部cell列出来//然后再利用CellUtil从每一个cell中获取数据List<Cell> cells = result.listCells();for (Cell cell : cells) {String value = Bytes.toString(CellUtil.cloneValue(cell));System.out.print(value+" ");}System.out.println();//打印完最后一行数据后换行}}

结果为
在这里插入图片描述
对于多版本(versions)的数据,必须使用CellUtil的方式取数据,否则只能取得最新版本的数据


http://chatgpt.dhexx.cn/article/PDZCfG3o.shtml

相关文章

Java 访问Hbase数据库

须知 Hbase数据最终是在hdfs上的&#xff0c;具体来说应该是在hdfs上一个叫做/hbase的目录下。具体结构如下&#xff1a; 所以java访问Hbase其实就是访问hdfs&#xff0c;所以环境搭建跟hadoop开发环境使用没什么不同。 实战部分 1.导入需要的jar包&#xff0c;此处在java项…

大数据之HBase数据库

一、了解HBase 1.1 HBase简介 HBase是Apache的Hadoop项目的子项目 HBase不同于一般的关系数据库&#xff0c;它是一个适合于非结构化数据存储的数据库 建立在Hadoop文件系统之上的分布式面向列的数据库 属于开源项目&#xff0c;可以进行横向扩展 适用于需要实时地随机访问…

pinpoint的Hbase数据库的数据优化

pinpoint的Hbase数据库的数据优化 写的原因&#xff1a; 因为是测试服务器&#xff0c;在运行测试项目时&#xff0c;需要日志的打印输出&#xff0c;由于发现磁盘空间不足&#xff0c;想删除些东西&#xff0c;释放空间&#xff0c;然后发现pinpoint服务的Hbase数据库占据了1…

2.使用HBase数据库操作_实验环境Ubuntu

实验前期准备 ssh localhost //检测自己的ssh服务器设置 cd /usr/local/hadoop ./sbin/start-dfs.sh //启动Hadoop jps //查看hadoop是否启动成功 cd /usr/local/hbase bin/start-hbase.sh //启动hbase jps //查看hadoop是否启动成功 bin/hbase shell //打开hbase的…

猿如意工具Redis数据库,Memcached数据库,MongoDB数据库,HBase数据库等等

按照参考样例&#xff1a; 安装教程 在电脑上安装好猿如意之后。因为第一次使用就搜了下各种数据库使用的方式 猿如意工具 Redis数据库Memcached数据库MongoDB数据库HBase数据库MySQL WorkbenchDBeaverNavicat Lite Redis数据库 点击搜索了下Redis数据库&#xff0c;可看到以…

hbase数据库详解

本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理存储、HBase系统架构&#xff0c;HBase调优、HBase Shell访问等。 不过在此之前&#xff0c;你可以先了解 Hadoop生态系统 &#xff0c;若想运行HBase&#xff0c;则需要先搭建…

Java连接HBASE数据库

HBASE是建立在Hadoop分布式系统基础之上的列模式数据库&#xff0c;Java连接HBASE需要如下几个jar包&#xff1a;hadoop-common、hadoop-mapreduce-client-core、hbase-common、hbase-client。这些jar包在maven仓库里都有&#xff0c;地址&#xff1a;https://mvnrepository.co…

Hbase数据库

第一关&#xff1a;Hbase数据库的安装 任务描述 本关任务&#xff1a;安装与配置HBase数据库。 相关知识 在安装HBase之前你需要先安装Hadoop和Zookeeper&#xff0c;如果你还没有安装可以通过这两个实训来学习&#xff1a;Hadoop安装与配置&#xff0c;Zookeeper安装与配置…

Hbase

Hbase 简介hadoop的局限HBase与NoSQLHBase的数据模型HBase的逻辑架构HBase物理存储结构数据模型Hbase基本结构&#xff08;不完整版&#xff09; 简介 hadoop的局限 hadoop主要实现批量数据的处理&#xff0c;并且通过顺序方式访问数据 要查找数据必须搜索整个数据库&#xf…

HBase介绍

第1章 HBase简介 1.1 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 1.2 HBase数据模型 逻辑上&#xff0c;HBase的数据模型同关系型数据库很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从HBase的底层物理存储结构&#xff08;K…

hbase数据库介绍,HBASE的特点,表结构逻辑视图,Row Key,列族,时间戳,Cell

HBASE数据库 1. Hbase基础 1.1 hbase数据库介绍 1、简介nosql hbase是bigtable的开源java版本。是建立在hdfs之上&#xff0c;提供高可靠性、高性能、列存储、可伸缩、实时读写nosql的数据库系 统。 它介于nosql和RDBMS之间&#xff0c;仅能通过主键(row key)和主键的ran…

大数据工具——HBASE数据库(一)

一、HBASE基础概念 1.HBASE概念 HBASE是一个数据库----可以提供数据的实时随机读写。HBASE与mysql、oralce、db2、sqlserver等关系型数据库不同&#xff0c;它是一个NoSQL数据库&#xff08;非关系型数据库&#xff09; 2.HBase特性 - HBase的表模型与关系型数据库的表模型…

HBase详细总结

1 HBase 浅析 1.1 HBase 是啥 HBase 是一款面向列存储&#xff0c;用于存储处理海量数据的 NoSQL 数据库。它的理论原型是Google 的 BigTable 论文。你可以认为 HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。 HBase 的存储是基于HDFS的&#xff0c;HDFS 有…

HBase详细概述

本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理存储、HBase系统架构&#xff0c;HBase调优、HBase Shell访问等。 不过在此之前&#xff0c;你可以先了解 Hadoop生态系统 &#xff0c;若想运行HBase&#xff0c;则需要先搭建…

JPG,PNG,BMP图片无损压缩软件

怎么压缩图片文件的大小呢&#xff1f;现在的科技发展迅速&#xff0c;手机或者摄像机拍摄的图片的像素很高&#xff0c;这样也就导致了图片比较大&#xff0c;我们想要将图片上传作为网站的头像或者其他网站平台都会对图片文件大小进行限制&#xff0c;今天教给大家一种压缩图…

深入前端图片压缩

前言 任何研究都不是凭空产生&#xff0c;至少博主是这样的。 在手机端拍照后图片很大&#xff0c;有的甚至有 10M 多。这个时候再去上传图片&#xff0c;可想而知&#xff0c;速度是很慢的。正因如此&#xff0c;便有了前端图片压缩这个需求。 图片格式 传统的图片格式有 gi…

html图片无损压缩,有损压缩和无损压缩的区别是什么

区别:无损压缩是可以完全还原的;而有损压缩还原后不能和原来文件一样,是有一定损耗的。有损压缩两种的基本机制(有损变换编解码和预测编解码);而无损压缩原理有行程编码、霍夫曼编码和算术编码等。 本教程操作环境:windows10系统、thinkpad t480电脑。 有损压缩是利用了人…

6种比较好的“在线图片无损压缩工具”+PDF转换工具

目录 第一&#xff1a;Tinypng 第二&#xff1a;Compressor.io 第三&#xff1a;Kraken.io 第四&#xff1a;Giftofspeed 第五&#xff1a; OptimiZilla 第六&#xff1a;Imagerecycle 第七&#xff1a;&#xff08;PDF转换工具&#xff09;ToePub 第一&#xff1a;Tiny…

Android图片无损压缩库ImageCompress使用(最新优化OOM问题的1.0.10版本)

转载请注明出处&#xff1a;https://blog.csdn.net/hh7181521/article/details/81014839 图片压缩一直是Android的一个痛点&#xff0c;相比较于iOS的效果&#xff0c;Android的压缩简直可以用惨不忍睹来形容&#xff01; 开源库ImageCompress是基于libjpeg-turbo来进行图片的压…

无损压缩技术

一个视频经过有损压缩完成后&#xff0c;会再进行无损压缩&#xff0c;让视频进一步变小。 DCT 变化 DCT 变化的过程又叫量化&#xff0c;经过有损压缩后&#xff0c;数据分散在二维图标中的各个节点上&#xff0c;经过 DCT 变化&#xff0c;会将所有数据集中到某一块。 转换…