最近项目中用到了Hbase相关的操作并封装成工具类,我的Hbase服务器端版本是2.1.0,图示如下:

特此记录便于日后查阅。

一、pom.xml 依赖

<dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-shaded-client</artifactId><version>2.1.0</version>
</dependency>
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.0.0</version>
</dependency>

二、application.yml 项目配置

        此处我是自定义HBase配置,后面会有专门的配置类来加载这个配置

datasource:hbase:zookeeper:port: 2181quorum: 10.0.61.12,10.0.61.22,10.0.61.24znode:parent: ''

三、HbaseConfig 自定义配置类

import lombok.Data;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;import java.io.IOException;/*** @description: Hbase配置类* @author: zhangzhixiang* @createDate: 2022/11/24* @version: 1.0*/
@Data
@Component
@Configuration
public class HbaseConfig {@Value("${datasource.hbase.zookeeper.quorum}")private String zookeeper;@Value("${datasource.hbase.zookeeper.znode.parent}")private String parent;@Value("${datasource.hbase.zookeeper.port}")private String port;public Connection getConnection() throws IOException {org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create();config.set("hbase.zookeeper.quorum", zookeeper);config.set("hbase.zookeeper.property.clientPort", port);if (parent != null && !"".equals(parent)) {config.set("zookeeper.znode.parent", parent);}Connection connection = ConnectionFactory.createConnection(config);return connection;}
}

四、HbaseUtil 工具类

首先添加 SpringContext 工具类,下面会用到:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;/*** @Description: * @Author:zhangzhixiang* @Date: 2022/7/25* @Version: 1.0*/
@Component
public class SpringContext implements ApplicationContextAware {public static ApplicationContext context;public static Environment env;@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {SpringContext.context = context;SpringContext.env = context.getEnvironment();}public static Object getBean(String name) {return context.getBean(name);}public static <T> T getBean(Class<T> clazz) {return context.getBean(clazz);}public static ApplicationContext getContext() {return context;}public static Environment getEnv() {return env;}public static String getProperty(String key) {return getProperty(key, "");}public static String getProperty(String key, String defaultValue) {return env.getProperty(key, defaultValue);}public static <T> T getProperty(String key, Class<T> targetType) {return env.getProperty(key, targetType);}public static String getActiveProfile() {return env.getActiveProfiles()[0];}
}

然后我们来写 HbaseUtil 工具类的代码:

import com.swkj.common.base.context.SpringContext;
import com.swkj.common.base.log.GLog;
import com.swkj.common.base.log.LogFactory;
import com.swkj.common.hbase.config.HbaseConfig;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.util.Bytes;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.NavigableMap;/*** @description: Hbase工具类* @author: zhangzhixiang* @createDate: 2022/11/24* @version: 1.0*/
@DependsOn("springContext")
@Component
public class HbaseUtil {private static final GLog LOG = LogFactory.getLogger(HbaseUtil.class);private static HbaseConfig hbaseConfig = (HbaseConfig) SpringContext.getBean("hbaseConfig");private static Connection connection = null;private static Admin admin = null;private HbaseUtil() {if (connection == null) {try {connection = hbaseConfig.getConnection();admin = connection.getAdmin();} catch (IOException e) {LOG.error("HbaseUtils实例初始化失败!错误信息为:" + e.getMessage(), e);}}}/*** 创建表** @param tableName    表名* @param columnFamily 列族(数组)*/public void createTable(String tableName, String[] columnFamily) throws IOException {TableName name = TableName.valueOf(tableName);//如果存在则删除if (admin.tableExists(name)) {admin.disableTable(name);admin.deleteTable(name);LOG.error("create htable error! this table {} already exists!", name);} else {HTableDescriptor desc = new HTableDescriptor(name);for (String cf : columnFamily) {desc.addFamily(new HColumnDescriptor(cf));}admin.createTable(desc);}}/*** 插入记录(单行单列族-多列多值)** @param tableName     表名* @param row           行名* @param columnFamilys 列族名* @param columns       列名(数组)* @param values        值(数组)(且需要和列一一对应)*/public void insertRecords(String tableName, String row, String columnFamilys, String[] columns, String[] values) throws IOException {TableName name = TableName.valueOf(tableName);Table table = connection.getTable(name);Put put = new Put(Bytes.toBytes(row));for (int i = 0; i < columns.length; i++) {put.addColumn(Bytes.toBytes(columnFamilys), Bytes.toBytes(columns[i]), Bytes.toBytes(values[i]));table.put(put);}}/*** 插入记录(单行单列族-单列单值)** @param tableName    表名* @param row          行名* @param columnFamily 列族名* @param column       列名* @param value        值*/public void insertOneRecord(String tableName, String row, String columnFamily, String column, String value) throws IOException {TableName name = TableName.valueOf(tableName);Table table = connection.getTable(name);Put put = new Put(Bytes.toBytes(row));put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));table.put(put);}/*** 删除一行记录** @param tablename 表名* @param rowkey    行名*/public void deleteRow(String tablename, String rowkey) throws IOException {TableName name = TableName.valueOf(tablename);Table table = connection.getTable(name);Delete d = new Delete(rowkey.getBytes());table.delete(d);}/*** 删除单行单列族记录** @param tablename    表名* @param rowkey       行名* @param columnFamily 列族名*/public void deleteColumnFamily(String tablename, String rowkey, String columnFamily) throws IOException {TableName name = TableName.valueOf(tablename);Table table = connection.getTable(name);Delete d = new Delete(rowkey.getBytes()).addFamily(Bytes.toBytes(columnFamily));table.delete(d);}/*** 删除单行单列族单列记录** @param tablename    表名* @param rowkey       行名* @param columnFamily 列族名* @param column       列名*/public void deleteColumn(String tablename, String rowkey, String columnFamily, String column) throws IOException {TableName name = TableName.valueOf(tablename);Table table = connection.getTable(name);Delete d = new Delete(rowkey.getBytes()).addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));table.delete(d);}/*** 查找一行记录** @param tablename 表名* @param rowKey    行名*/public static String selectRow(String tablename, String rowKey) throws IOException {String record = "";TableName name = TableName.valueOf(tablename);Table table = connection.getTable(name);Get g = new Get(rowKey.getBytes());Result rs = table.get(g);NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = rs.getMap();for (Cell cell : rs.rawCells()) {StringBuffer stringBuffer = new StringBuffer().append(Bytes.toString(cell.getRowArray())).append("\t").append(Bytes.toString(cell.getFamilyArray())).append("\t").append(Bytes.toString(cell.getQualifierArray())).append("\t").append(Bytes.toString(cell.getValueArray())).append("\n");String str = stringBuffer.toString();record += str;}return record;}/*** 查找单行单列族单列记录** @param tablename    表名* @param rowKey       行名* @param columnFamily 列族名* @param column       列名* @return*/public static String selectValue(String tablename, String rowKey, String columnFamily, String column) throws IOException {TableName name = TableName.valueOf(tablename);Table table = connection.getTable(name);Get g = new Get(rowKey.getBytes());g.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));Result rs = table.get(g);return Bytes.toString(rs.value());}/*** 查询表中所有行(Scan方式)** @param tablename* @return*/public String scanAllRecord(String tablename) throws IOException {String record = "";TableName name = TableName.valueOf(tablename);Table table = connection.getTable(name);Scan scan = new Scan();ResultScanner scanner = table.getScanner(scan);try {for (Result result : scanner) {for (Cell cell : result.rawCells()) {StringBuffer stringBuffer = new StringBuffer().append(Bytes.toString(cell.getRowArray())).append("\t").append(Bytes.toString(cell.getFamilyArray())).append("\t").append(Bytes.toString(cell.getQualifierArray())).append("\t").append(Bytes.toString(cell.getValueArray())).append("\n");String str = stringBuffer.toString();record += str;}}} finally {if (scanner != null) {scanner.close();}}return record;}/*** 根据rowkey关键字查询报告记录** @param tablename* @param rowKeyword* @return*/public List scanReportDataByRowKeyword(String tablename, String rowKeyword) throws IOException {ArrayList<String> list = new ArrayList<>();Table table = connection.getTable(TableName.valueOf(tablename));Scan scan = new Scan();//添加行键过滤器,根据关键字匹配RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(rowKeyword));scan.setFilter(rowFilter);ResultScanner scanner = table.getScanner(scan);try {for (Result result : scanner) {//TODO 此处根据业务来自定义实现list.add(null);}} finally {if (scanner != null) {scanner.close();}}return list;}/*** 根据rowkey关键字和时间戳范围查询报告记录** @param tablename* @param rowKeyword* @return*/public List scanReportDataByRowKeywordTimestamp(String tablename, String rowKeyword, Long minStamp, Long maxStamp) throws IOException {ArrayList<String> list = new ArrayList<>();Table table = connection.getTable(TableName.valueOf(tablename));Scan scan = new Scan();//添加scan的时间范围scan.setTimeRange(minStamp, maxStamp);RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(rowKeyword));scan.setFilter(rowFilter);ResultScanner scanner = table.getScanner(scan);try {for (Result result : scanner) {//TODO 此处根据业务来自定义实现list.add(null);}} finally {if (scanner != null) {scanner.close();}}return list;}/*** 删除表操作** @param tablename*/public void deleteTable(String tablename) throws IOException {TableName name = TableName.valueOf(tablename);if (admin.tableExists(name)) {admin.disableTable(name);admin.deleteTable(name);}}
}

五、使用

接下来只需要在项目业务类里注入hbaseUtils就可以使用了:

@Autowired
private HbaseUtil hbaseUtil;

测试方法:

import com.swkj.common.hbase.utils.HbaseUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;/*** @description: Hbase工具类测试* @author: zhangzhixiang* @createDate: 2022/11/24* @version: 1.0*/
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = "local")
public class HbaseServiceTest {@Autowired
private HbaseUtil hbaseUtil;@Testpublic void testHbase() {try {hbaseUtil.createTable("Student", new String[]{"StuInfo", "Grades"});hbaseUtil.insertOneRecord("Student", "0001", "StuInfo", "name", "Tom Green");hbaseUtil.insertOneRecord("Student", "0002", "StuInfo", "Age", "18");System.out.println("=================" + hbaseUtil.selectValue("Student", "0001", "StuInfo", "name"));System.out.println("=================" + hbaseUtil.selectValue("Student", "0002", "StuInfo", "Age"));System.out.println("=================" + hbaseUtil.selectRow("Student", "0001"));System.out.println("=================" + hbaseUtil.selectRow("Student", "0002"));} catch (Exception e) {e.printStackTrace();}}
}

到此 SpringBoot 封装 HBase 操作工具类介绍完成。

SpringBoot 封装 HBase 操作工具类相关推荐

  1. Hbase 操作工具类

    依赖jar <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-clien ...

  2. springboot HBase操作工具类

  3. springboot 封装接口返回类

    接口调用或者前后端交互都必不可少一个返回的封装类 ResponseMessage.java package com.hiqiblog.ViewModel;public class ResponseMe ...

  4. SpringBoot整合Redis+mybatis,封装RedisUtils工具类等实战(附源码)

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:陈彦斌 cnblogs.com/chenyanbin/ ...

  5. JAVA——文件操作工具类封装的简单实现

    问题描述 关于文件操作的简单工具类,包括文件夹创建,文件夹删除,文件创建,文件重命名,文件复制,文件删除.如果需要文件夹复制,其实就是创建文件夹和复制文件的操作. 解决方案 上下文 package c ...

  6. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. Redis操作工具类

    前期文章中关于RedisOperateUtil工具类使用时需要强制类型转换,针对List等操作不方便,为此特意更新RedisOperateUtil工具类,前文链接:https://blog.csdn. ...

  8. java mysql 工具类_Java SE 之 数据库操作工具类(DBUtil)设计

    JDBC创建数据库基本连接 //1.加载驱动程序 Class.forName(driveName); //2.获得数据库连接 Connection connection = DriverManager ...

  9. Java封装OkHttp3工具类

    点击关注公众号,Java干货及时送达  作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...

最新文章

  1. Macbook 无法找到Centos启动盘问题解决
  2. loj.ac:#10024. 「一本通 1.3 练习 3」质数方阵
  3. 手把手教你部署一个最小化的 Kubernetes 集群
  4. Nacos注册服务都注册在public空间下
  5. python 中 feedparser的简单用法
  6. git如何merge github forked repository里的代码更新?
  7. lfu算法实现c语言_哈希查找算法(C语言实现)
  8. 在SQL Server中为什么不建议使用Not In子查询
  9. 与圆相关的计算(信息学奥赛一本通-T1014)
  10. ios 扫码枪外设 键盘模式_苹果iOS 13新增滑行键入功能 开启新键盘模式
  11. java游戏开发入门(一) - HelloWorld
  12. 为什么红黑树查询快_为什么要有红黑树?什么是红黑树?画了20张图,看完这篇你就明白了...
  13. 新的笔记本电脑没有计算机,最新出炉!2020年10款最轻的笔记本电脑:轻就对了,是您想的吗?...
  14. 一、量子信息基本概念
  15. 毕业论文必备技巧:Word页脚及页眉设置
  16. 搜狗大数据总监、Polarr 联合创始人关于深度学习的分享交流
  17. Ubuntu装系统后重启卡死解决办法(超详细)
  18. error怎么开机 fan_台式机开机出现cpu fan error怎么办
  19. 十六、MDT 2013 Update 1批量部署-应用程序导入及自动安装(含OFFICE 2007安装)
  20. 真的高品质吗?看声谱鉴别真假音质

热门文章

  1. 海尔卡奥斯、树根互联们的标识解析体系,建设难点在于哪?
  2. (一)redis 5种数据基础查询命令
  3. Python使用VTK三维3D图形绘制入门教程
  4. CarSim仿真快速入门(十三)—转向系统
  5. java计算机毕业设计融呗智慧金融微资讯移动平台服务端源码+系统+数据库+lw文档+mybatis+运行部署
  6. linux退出erl命令行
  7. LDF explorer使用问题记录
  8. 现在投入两三万元,在农村做哪些项目,一年能有10万以上的收入?
  9. 【翻译】Postmortem-debugging-Go-services-with-Delve
  10. 前端弹出 不同的浏览器 ie弹出谷歌浏页面