HBase学习笔记(2)—— API使用
对HBase中常用的API操作进行简单的介绍
对应HBase学习笔记(1)—— 知识点总结-CSDN博客中介绍的HBase Shell常用操作
更多用法请参考官网:Apache HBase ™ Reference Guide
依赖导入
<dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>2.4.11</version><exclusions><exclusion><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId><version>3.0.1-b06</version></dependency></dependencies>
打包所用的插件:
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions></plugin></plugins></build>
建立连接
package com.why;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;public class HBaseConnect2 {public static Connection connection = null;static {try {connection = ConnectionFactory.createConnection(); //使用配置文件中的参数hbase.zookeeper.quorumSystem.out.println(connection);} catch (IOException e) {System.out.println("连接创建失败");throw new RuntimeException(e);}}/*** 关闭连接* @throws IOException*/public static void closeConnection() throws IOException {if (connection != null){connection.close();}}}
DDL操作
package com.why;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;public class HBaseDDL {//获取连接private static Connection connection = HBaseConnect2.connection;/*** 创建命名空间* @param namespace 命名空间名称* @throws IOException*/public static void createNamespace(String namespace) throws IOException {//获取admin(admin的连接是轻量级的,不是线程安全的,不推荐池化或缓存)Admin admin = connection.getAdmin();//创建命名空间builderNamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);// builder.addConfiguration("user","why");try{admin.createNamespace(builder.build());}catch (IOException e){System.out.println("命名空间已经存在");e.printStackTrace();}admin.close();}/*** 查看所有命名空间* @throws IOException*/public static void listNamespaces() throws IOException {Admin admin = connection.getAdmin();try {String[] strings = admin.listNamespaces();System.out.println("命名空间如下:");for(String string : strings){System.out.println(string);}}catch (IOException e){e.printStackTrace();}admin.close();}/*** 判断表格是否存在* @param namespace 命名空间* @param table 表格名称* @return* @throws IOException*/public static boolean isTableExist(String namespace,String table) throws IOException {Admin admin = connection.getAdmin();boolean isExist = false;try {//通过tableExists方法判断表格是否存在isExist = admin.tableExists(TableName.valueOf(namespace,table));}catch (IOException e){e.printStackTrace();}admin.close();return isExist;}/*** 创建表格* @param namespace 命名空间* @param table 表格名称* @param columnFamilies 列族名称* @throws IOException*/public static void createTable(String namespace , String table , String... columnFamilies) throws IOException {//判断是否至少有一个列族if(columnFamilies.length == 0){System.out.println("至少要有一个列族");return;}//判断表格是否已经存在if(isTableExist(namespace,table)){System.out.println("表格已经存在");return;}Admin admin = connection.getAdmin();//创建表格描述的构建器TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, table));//添加参数for(String columnFamily : columnFamilies){//创建列族描述的构建器ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));columnFamilyDescriptorBuilder.setMaxVersions(5); //添加最大版本数tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build()); //创建添加完参数的列族描述}try {admin.createTable(tableDescriptorBuilder.build());}catch (IOException e){e.printStackTrace();}admin.close();}/*** 查看所有表格* @throws IOException*/public static void listTableNames() throws IOException {Admin admin = connection.getAdmin();try {TableName[] tableNames = admin.listTableNames();System.out.println("所有表格如下");for(TableName tableName : tableNames){System.out.println(tableName.getNamespaceAsString() + ":" + tableName.getNameAsString());}}catch (IOException e){e.printStackTrace();}admin.close();}/*** 修改表格中某一个列族的版本号* @param namespace* @param table* @param columnFamily 列族* @param version 版本号*/public static void modifyTable(String namespace , String table , String columnFamily , int version) throws IOException {if(!isTableExist(namespace,table)){System.out.println("表格不存在,无法修改");return;}Admin admin = connection.getAdmin();try {//获取表格描述TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, table));//创建新的表格描述构建器TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);//获取列族描述ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));//创建新的列族描述构建器ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);//设置参数columnFamilyDescriptorBuilder.setMaxVersions(version);//将新的列族描述添加到表格描述中tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());admin.modifyTable(tableDescriptorBuilder.build());}catch (IOException e){e.printStackTrace();}admin.close();}/**** @param namespace* @param table* @return true表示删除成功*/public static boolean deleteTable(String namespace , String table) throws IOException {if(!isTableExist(namespace,table)){System.out.println("表格不存在,无法删除");return false;}Admin admin = connection.getAdmin();try {TableName tableName = TableName.valueOf(namespace, table);admin.disableTable(tableName);admin.deleteTable(tableName);}catch (IOException e){e.printStackTrace();}admin.close();return true;}}
DML操作
package com.why;import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;public class HBaseDML {private static Connection connection = HBaseConnect2.connection;/*** 插入数据** @param namespace* @param table* @param rowKey* @param columnFamily* @param column* @param value* @throws IOException*/public static void insert(String namespace, String table, String rowKey, String columnFamily, String column, String value) throws IOException {//首先获取表格tableTable table1 = connection.getTable(TableName.valueOf(namespace, table));System.out.println("表格创建成功");//创建put对象Put put = new Put(Bytes.toBytes(rowKey));System.out.println("put对象创建成功");//向put对象中添加数据put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));try {table1.put(put);System.out.println("数据插入成功");} catch (IOException e) {e.printStackTrace();}table1.close();}/*** 读取数据** @param namespace* @param table* @param rowKey* @param columnFamily* @param column* @throws IOException*/public static void get(String namespace, String table, String rowKey, String columnFamily, String column) throws IOException {//获取tableTable table1 = connection.getTable(TableName.valueOf(namespace, table));//获取get对象Get get = new Get(Bytes.toBytes(rowKey));//设置读取某一列的数据(如果不设置的话则读取所有数据)get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));try {//调用get方法读取数据Result result = table1.get(get);//获取到所有的cellCell[] cells = result.rawCells();//打印valuefor (Cell cell : cells) {String value = new String(CellUtil.cloneValue(cell));System.out.println(value);}} catch (IOException e) {e.printStackTrace();}table1.close();}/*** 扫描表** @param namespace* @param table* @param startRow* @param stopRow* @throws IOException*/public static void scan(String namespace, String table, String startRow, String stopRow) throws IOException {//获取tableTable table1 = connection.getTable(TableName.valueOf(namespace, table));//创建scan对象Scan scan = new Scan();//添加扫描的起止rowKeyscan.withStartRow(Bytes.toBytes(startRow));scan.withStopRow(Bytes.toBytes(stopRow));try {ResultScanner scanner = table1.getScanner(scan);for (Result result : scanner) {Cell[] cells = result.rawCells();for (Cell cell : cells) {System.out.print(newString(CellUtil.cloneRow(cell)) + "-" + newString(CellUtil.cloneFamily(cell)) + "-" + newString(CellUtil.cloneQualifier(cell)) + "-" + newString(CellUtil.cloneValue(cell)) + "\t");}System.out.println();;}} catch (IOException e) {e.printStackTrace();}table1.close();}/*** 扫描表(有过滤器)** @param namespace* @param table* @param startRow* @param stopRow* @param columnFamily* @param column* @param value*/public static void scanWithFilter(String namespace, String table, String startRow, String stopRow, String columnFamily, String column, String value) throws IOException {//获取tableTable table1 = connection.getTable(TableName.valueOf(namespace, table));//创建scan对象Scan scan = new Scan();//添加扫描的起止rowKeyscan.withStartRow(Bytes.toBytes(startRow));scan.withStopRow(Bytes.toBytes(stopRow));//创建过滤器列表FilterList filterList = new FilterList();//创建列过滤器,作用:只保留当前列的数据ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(columnFamily),Bytes.toBytes(column),CompareOperator.EQUAL,Bytes.toBytes(value));// // (2) 结果保留整行数据
// // 结果同时会保留没有当前列的数据
// SingleColumnValueFilter singleColumnValueFilter = new
// SingleColumnValueFilter(
// // 列族名称
// Bytes.toBytes(columnFamily),
// // 列名
// Bytes.toBytes(column),
// // 比较关系
// CompareOperator.EQUAL,
// // 值
// Bytes.toBytes(value)
// );filterList.addFilter(columnValueFilter);scan.setFilter(filterList);try {ResultScanner scanner = table1.getScanner(scan);for (Result result : scanner) {Cell[] cells = result.rawCells();for (Cell cell : cells) {System.out.print(newString(CellUtil.cloneRow(cell)) + "-" + newString(CellUtil.cloneFamily(cell)) + "-" + newString(CellUtil.cloneQualifier(cell)) + "-" + newString(CellUtil.cloneValue(cell)) + "\t");}System.out.println();;}} catch (IOException e) {e.printStackTrace();}table1.close();}/*** 删除数据* @param nameSpace* @param table* @param rowKey* @param columnFamily* @param column* @throws IOException*/public static void delete(String nameSpace, String table, String rowKey, String columnFamily, String column) throws IOException {//获取 tableTable table1 = connection.getTable(TableName.valueOf(nameSpace, table));//创建 Delete 对象Delete delete = new Delete(Bytes.toBytes(rowKey));//添加删除信息//删除单个版本(默认最新)delete.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column));// //删除所有版本
// delete.addColumns(Bytes.toBytes(columnFamily),Bytes.toBytes(column));//删除列族delete.addFamily(Bytes.toBytes(columnFamily));try {table1.delete(delete);}catch (IOException e){e.printStackTrace();}table1.close();}
}
说明:本学习笔记根据基于尚硅谷课程进行整理,课程链接:hbase
未完待续~
相关文章:
HBase学习笔记(2)—— API使用
对HBase中常用的API操作进行简单的介绍 对应HBase学习笔记(1)—— 知识点总结-CSDN博客中介绍的HBase Shell常用操作 更多用法请参考官网:Apache HBase ™ Reference Guide 依赖导入 <dependencies><dependency><groupId>o…...
C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发004:游戏核心消息处理 - 玩家类的实现
文章目录 0 代码仓库1 需求2 AOI设计2.1 AOI算法简介2.2 AOI数据结构及实现2.2.1 玩家2.2.2 网格对象2.2.3 游戏世界矩形2.2.4 获取周围玩家的实现2.2.5 代码测试 2.3 GameRole结合AOI创建玩家2.3.1 创建游戏世界全局对象-GameRole继承AOIWorld的Player2.3.2 把玩家到游戏世界的…...
Python Selenium元素定位方法详解
引言 在Web自动化测试中,元素定位是一项非常重要的技术。Python Selenium提供了各种元素定位方法,可以帮助我们定位页面上的元素并与之交互。本文将详细介绍Python Selenium中常用的元素定位方法,并提供实例代码。 1. ID定位 ID是元素在HT…...
分布式事务,你了解多少?(上)
本文主要是讲述分布式事务的理论及常用的技术方案,主要源自各类学习和工作总结,如有不妥之处,还望指正。分布式事务的其他基础请自行查阅资料。 一、分布式事务产生的原因 分布式事务的产生,源自互联网、电商等的发展,…...
ClickHouse主键索引最佳实践
在本文中,我们将深入研究ClickHouse索引。我们将对此进行详细说明和讨论: ClickHouse的索引与传统的关系数据库有何不同ClickHouse是怎样构建和使用主键稀疏索引的ClickHouse索引的最佳实践 您可以选择在自己的机器上执行本文给出的所有Clickhouse SQL…...
Flink 基础 -- 应用开发(项目配置)
1、概述 本节中的指南将向您展示如何通过流行的构建工具(Maven, Gradle)配置项目,添加必要的依赖项(即连接器和格式,测试),并涵盖一些高级配置主题。 每个Flink应用程序都依赖于一组Flink库。至少,应用程序依赖于Flink api&…...
空间曲面@常见曲面方程
文章目录 曲面的基本问题特殊曲面球面方程球的标准形方程一般形方程例 柱面柱面方程不同维度下同方程的图形常见柱面方程 旋转曲面旋转曲面的方程旋转情况分类以yOz上的曲线绕 z z z轴旋转为例 旋转曲面的方程常见旋转曲面方程 锥面其他曲面 曲面的基本问题 根据曲面(点的几何…...
unity 接收和发送Udp消息
因为需要用到unity和其他的程序交互,其他程序可以提供Udp消息,因此找了合适的相互连接方法。这里直接上代码。 工具类: using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; u…...
机器学习股票大数据量化分析与预测系统 - python 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…...
架构描述语言(ADL)
1.架构描述语言(ADL) 架构描述语言(Architecture Description Language, ADL)是一种为明确说明软件系统的概念架构和对这些概念架构建模提供功能的语言。 2.ADL基本构成要素 ADL即架构描述语言,其基本构成要素包括:…...
GZ038 物联网应用开发赛题第2套
2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第2套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员,…...
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍 文章目录 Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1 一切皆组合2.2 垂直组合2.2.1 第一种:通过嵌入接口构建接口2.2.2 第二种:通过嵌入接…...
Vue3全局共享数据
目录 1,Vuex2,provide & inject2,global state4,Pinia5,对比 1,Vuex vue2 的官方状态管理器,vue3 也是可以用的,需要使用 4.x 版本。 相对于 vuex3.x,有两个重要变…...
openai自定义API操作 API 返回值说明
custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key(获取测试key)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheStrin…...
jsp基本表格和简单算法表格
基本表格; <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd…...
在线存储系统源码 网盘网站源码 云盘系统源码
Cloudreve云盘系统源码-支持本地储存和对象储存,界面美观 云盘系统安装教程 测试环境:PHP7.1 MYSQL5.6 Apache 上传源码到根目录 安装程序: 浏览器数据 http://localhost/CloudreveInstallerlocalhost更换成你的网址 安装完毕 记住系统默认的账号密码 温馨提示:如果默认…...
线性代数(六)| 二次型 标准型转换 正定二次型 正定矩阵
文章目录 1. 二次型化为标准型1.1 正交变换法1.2 配方法 2 . 正定二次型与正定矩阵 1. 二次型化为标准型 和第五章有什么样的联系 首先上一章我们说过对于对称矩阵,一定存在一个正交矩阵Q,使得$Q^{-1}AQB $ B为对角矩阵 那么这一章中,我们…...
Kotlin系列之注解详解
目录 注解:file:JvmName 注解:JvmField 注解:JvmOverloads 注解:JvmStatic 注解:JvmMultifileClass 注解:JvmSynthetic 注解:file:JvmName file:JvmName(“XXX”) 放在类的最顶层&#x…...
Go 面向对象,多态,基本数据类型
程序功能解读 第一行为可执行程序的包名,所有的Go源文件头部必须有一个包生命语句,Go通过包名来管理命名空间。 第三行import是引用外部包的说明 func关键字声明定义一个函数,如果是main则代表是Go程序入口函数 Go源码特征解读 源程序以.g…...
使用 Python修改JSON 文件中对应键值
文章目录 前言代码分析 前言 在日常的数据处理工作中,经常需要对 JSON 文件进行读取和修改。在 Python 中,处理 JSON 文件非常方便。本文将通过一个简单的示例程序来演示如何读取和修改 JSON 文件。 代码分析 首先,需要导入 json 和 os 模块…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
