热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

电商指标项目HBaseUtil工具类(完整源码)

Flink整合Kafka,可以从Kafka中获取数据进行分析,分析之后要把结果存入HBase中编写一个操作HBase的工具类。HBase作为一个数据库

Flink整合Kafka,可以从Kafka中获取数据进行分析,分析之后要把结果存入HBase中

编写一个操作HBase的工具类。HBase作为一个数据库,写一个工具类,实现数据的增删改查
在这里插入图片描述

1. API介绍
方法名用途参数说明返回值
getTable创建/获取表tableNameStr:表名
columnFamily:列族名
HBase Table对象
putData插入/更新一列数据tableNameStr: 表名
rowkey:String rowkey
columnFamily:列族名
column:String 列名
data:String 列值
putMapData插入/更新多个列数据tableNameStr: 表名
rowkey:String rowkey
columnFamily:列族名
mapData:列名/列值
getData根据rowkey,列族+列名
获取单列数据
tableNameStr: 表名
rowkey:String rowkey
columnFamily:列族名
column:列名
列对应的数据
String类型
getMapData根据rowkey,列族+列名集合
获取多列数据
tableNameStr: 表名
rowkey:String rowkey
columnFamily:列族名
column:列名集合
列对应的数据
Map[列名, 列值]
deleteData根据rowkey删除一条数据tableNameStr: 表名
rowkey:rowkey
columnFamily: 列族名

HBase操作基本类

类名用途获取方式
ConfigurationHBase的配置类HBaseConfiguration.create
Connection连接ConnectionFactory.createConnection(conf)
AdminHBase的操作APIConnection.getAdmin
Table用来链接HBase的单表Connection.getTable()
Get用来查询HBase的单行数据new Get(rowkey.getBytes())
Put保存单行数据new Put(rowkey.getBytes())
Delete删除单行数据new Delete(rowkey.getBytes())

2. 获取表

开发步骤:

  1. 将导入hbase-site.xml配置文件到resources目录
  2. util包中添加HBaseUtil
    • 使用HBaseConfiguration.create获取配置对象Configuration,该配置对象会自动加载hbase-site.xml
    • 使用ConnectionFactory.createConnection获取hbase连接
    • 使用Connection.getAdmin获取与master的连接
  3. 创建getTable方法
    • 构建TableName
    • 构建TableDescriptorBuilder
    • 构建ColumnFamilyDescriptor
    • 添加列族
    • 检查表是否存在,若不存在,则创建表

源码解析:
在这里插入图片描述

3. 存储数据

创建putData方法

  • 调用getTable获取表
  • 构建Put对象
  • 添加列、列值
  • 对table执行put操作
  • 启动编写main进行测试

4. 获取数据
  1. 使用Connection获取表
  2. 创建getData方法
    • 调用getTable获取表
    • 构建Get对象
    • 对table执行get操作,获取result
    • 使用Result.getValue获取列族列对应的值
    • 捕获异常
    • 关闭表
  3. 启动hhbase
  4. 启动编写main进行测试

# 5. 批量存储数据
创建`putMapData`方法- 调用`getTable`获取表
- 构建`Put`对象
- 添加Map中的列、列值
- 对table执行put操作
- 捕获异常
- 关闭表
- 启动编写main进行测试# 6. 批量获取数据
创建`putMapData`方法- 调用`getTable`获取表
- 构建`Get`对象
- 根据Get对象查询表
- 构建可变Map
- 遍历查询各个列的列值
- 过滤掉不符合的结果
- 把结果转换为Map返回
- 捕获异常
- 关闭表
- 启动编写main进行测试# 7. 删除数据
创建`deleteData`方法- 调用`getTable`获取表
- 构建`Delete`对象
- 对table执行delete操作
- 捕获异常
- 关闭表
- 启动编写main进行测试完整代码:```java
package com.xu.realprocess.utilimport org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.{HBaseConfiguration, TableName}
import org.apache.hadoop.hbase.client.{ColumnFamilyDescriptor, _}
import org.apache.hadoop.hbase.util.Bytes/*** HBase的工具类** 获取Table* 保存单列数据* 查询单列数据* 保存多列数据* 查询多列数据* 删除数据*/
object HBaseUtil {// HBase的配置类, 不需要指定配置文件名,文件名要求是hbase-site.xmlval conf: Configuration &#61; HBaseConfiguration.create()// HBase的连接val conn: Connection &#61; ConnectionFactory.createConnection(conf)// HBase的操作APIval admin: Admin &#61; conn.getAdmin/*** 返回table,如果不存在,则创建表*/def getTable(tableNameStr: String, columnFamilyName: String): Table &#61; {// 获取TableNameval tableName: TableName &#61; TableName.valueOf(tableNameStr)// 如果表不存在,则创建表if (!admin.tableExists(tableName)) {// 构建出 表的描述的建造者val descBuilder: TableDescriptorBuilder &#61; TableDescriptorBuilder.newBuilder(tableName)val familyDescriptor: ColumnFamilyDescriptor &#61; ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyName.getBytes).build()// 给表去添加列族descBuilder.setColumnFamily(familyDescriptor)// 创建表admin.createTable(descBuilder.build())}conn.getTable(tableName)}/*** 存储单列数据** &#64;param tableNameStr 表名* &#64;param rowkey rowkey* &#64;param columnFamilyName 列族名* &#64;param columnName 列名* &#64;param columnValue 列值*/def putData(tableNameStr: String, rowkey: String, columnFamilyName: String, columnName: String, columnValue: String) &#61; {// 获取表val table: Table &#61; getTable(tableNameStr, columnFamilyName)try {// Putval put: Put &#61; new Put(rowkey.getBytes)put.addColumn(columnFamilyName.getBytes, columnName.getBytes, columnValue.getBytes)// 保存数据table.put(put)} catch {case ex: Exception &#61;> {ex.printStackTrace()}} finally {table.close()}}/*** 通过单列名获取列值* &#64;param tableNameStr 表名* &#64;param rowkey rowkey* &#64;param columnFamilyName 列族名* &#64;param columnName 列名* &#64;return 列值*/def getData(tableNameStr: String, rowkey: String, columnFamilyName: String, columnName: String): String &#61; {// 1.获取Table对象val table &#61; getTable(tableNameStr, columnFamilyName)try {// 2. 构建Get对象val get &#61; new Get(rowkey.getBytes)// 3. 进行查询val result: Result &#61; table.get(get)// 4. 判断查询结果是否为空,并且包含我们要查询的列if (result !&#61; null && result.containsColumn(columnFamilyName.getBytes, columnName.getBytes)) {val bytes: Array[Byte] &#61; result.getValue(columnFamilyName.getBytes(), columnName.getBytes)Bytes.toString(bytes)} else {""}} catch {case ex: Exception &#61;> {ex.printStackTrace()""}} finally {// 5. 关闭表table.close()}}/*** 存储多列数据* &#64;param tableNameStr 表名* &#64;param rowkey rowkey* &#64;param columnFamilyName 列族名* &#64;param map 多个列名和列值集合*/def putMapData(tableNameStr: String, rowkey: String, columnFamilyName: String, map: Map[String, Any]) &#61; {// 1. 获取Tableval table &#61; getTable(tableNameStr, columnFamilyName)try {// 2. 创建Putval put &#61; new Put(rowkey.getBytes)// 3. 在Put中添加多个列名和列值for ((colName, colValue) <- map) {put.addColumn(columnFamilyName.getBytes, colName.getBytes, colValue.toString.getBytes)}// 4. 保存Puttable.put(put)} catch {case ex: Exception &#61;> {ex.printStackTrace()}} finally {// 5. 关闭表table.close()}}/*** 获取多列数据的值* &#64;param tableNameStr 表名* &#64;param rowkey rowkey* &#64;param columnFamilyName 列族名* &#64;param columnNameList 多个列名* &#64;return 多个列名和多个列值的Map集合*/def getMapData(tableNameStr: String, rowkey: String, columnFamilyName: String, columnNameList: List[String]): Map[String, String] &#61; {// 1. 获取Tableval table &#61; getTable(tableNameStr, columnFamilyName)try{// 2. 构建Getval get &#61; new Get(rowkey.getBytes)// 3. 执行查询val result: Result &#61; table.get(get)// 4. 遍历列名集合,取出列值,构建成Map返回columnNameList.map {col &#61;>val bytes: Array[Byte] &#61; result.getValue(columnFamilyName.getBytes(), col.getBytes)if (bytes !&#61; null && bytes.size > 0) {col -> Bytes.toString(bytes)}else{""->""}}.filter(_._1!&#61;"").toMap}catch{case ex:Exception&#61;>{ex.printStackTrace()Map[String,String]()}}finally {// 5. 关闭Tabletable.close()}}/*** 删除数据*/def deleteData(tableNameStr:String,rowkey:String,columnFamilyName:String)&#61;{// 1. 获取Tableval table:Table &#61; getTable(tableNameStr,columnFamilyName)try{// 2. 构建Delete对象val delete:Delete &#61; new Delete(rowkey.getBytes)// 3. 执行删除table.delete(delete)}catch {case ex:Exception&#61;>ex.printStackTrace()}finally {// 4. 关闭tabletable.close()}}}

main方法测试代码

object HBaseUtil {def main(args: Array[String]): Unit &#61; {// 测试存入单列数据putData("test", "123", "info", "t1", "hello world")// 测试存入多列数据val map &#61; Map("t2" -> "scala","t3" -> "hive","t4" -> "sqoop")putMapData("test", "123", "info", map)println(getData("test", "123", "info", "t1"))println(getData("test", "123", "info", "t2"))println(getData("test", "123", "info", "t3"))println(getData("test", "123", "info", "t4"))println(getMapData("test", "123", "info", List("t1", "t2","t3","t4")))deleteData("test", "123", "info")}}

查看页面&#xff1a;

http://node01:16010/master-status#userTables

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
心韵怡怡雅琦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有