当前位置: 首页 > news >正文

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学习笔记&#xff08;1&#xff09;—— 知识点总结-CSDN博客中介绍的HBase Shell常用操作 更多用法请参考官网&#xff1a;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自动化测试中&#xff0c;元素定位是一项非常重要的技术。Python Selenium提供了各种元素定位方法&#xff0c;可以帮助我们定位页面上的元素并与之交互。本文将详细介绍Python Selenium中常用的元素定位方法&#xff0c;并提供实例代码。 1. ID定位 ID是元素在HT…...

分布式事务,你了解多少?(上)

本文主要是讲述分布式事务的理论及常用的技术方案&#xff0c;主要源自各类学习和工作总结&#xff0c;如有不妥之处&#xff0c;还望指正。分布式事务的其他基础请自行查阅资料。 一、分布式事务产生的原因 分布式事务的产生&#xff0c;源自互联网、电商等的发展&#xff0c…...

ClickHouse主键索引最佳实践

在本文中&#xff0c;我们将深入研究ClickHouse索引。我们将对此进行详细说明和讨论&#xff1a; ClickHouse的索引与传统的关系数据库有何不同ClickHouse是怎样构建和使用主键稀疏索引的ClickHouse索引的最佳实践 您可以选择在自己的机器上执行本文给出的所有Clickhouse SQL…...

Flink 基础 -- 应用开发(项目配置)

1、概述 本节中的指南将向您展示如何通过流行的构建工具(Maven, Gradle)配置项目&#xff0c;添加必要的依赖项(即连接器和格式&#xff0c;测试)&#xff0c;并涵盖一些高级配置主题。 每个Flink应用程序都依赖于一组Flink库。至少&#xff0c;应用程序依赖于Flink api&…...

空间曲面@常见曲面方程

文章目录 曲面的基本问题特殊曲面球面方程球的标准形方程一般形方程例 柱面柱面方程不同维度下同方程的图形常见柱面方程 旋转曲面旋转曲面的方程旋转情况分类以yOz上的曲线绕 z z z轴旋转为例 旋转曲面的方程常见旋转曲面方程 锥面其他曲面 曲面的基本问题 根据曲面(点的几何…...

unity 接收和发送Udp消息

因为需要用到unity和其他的程序交互&#xff0c;其他程序可以提供Udp消息&#xff0c;因此找了合适的相互连接方法。这里直接上代码。 工具类&#xff1a; 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 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…...

架构描述语言(ADL)

1.架构描述语言&#xff08;ADL) 架构描述语言&#xff08;Architecture Description Language, ADL&#xff09;是一种为明确说明软件系统的概念架构和对这些概念架构建模提供功能的语言。 2.ADL基本构成要素 ADL即架构描述语言&#xff0c;其基本构成要素包括&#xff1a;…...

GZ038 物联网应用开发赛题第2套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第2套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员,…...

Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍

Go 接口&#xff1a;Go中最强大的魔法,接口应用模式或惯例介绍 文章目录 Go 接口&#xff1a;Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1 一切皆组合2.2 垂直组合2.2.1 第一种&#xff1a;通过嵌入接口构建接口2.2.2 第二种&#xff1a;通过嵌入接…...

Vue3全局共享数据

目录 1&#xff0c;Vuex2&#xff0c;provide & inject2&#xff0c;global state4&#xff0c;Pinia5&#xff0c;对比 1&#xff0c;Vuex vue2 的官方状态管理器&#xff0c;vue3 也是可以用的&#xff0c;需要使用 4.x 版本。 相对于 vuex3.x&#xff0c;有两个重要变…...

openai自定义API操作 API 返回值说明

custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…...

jsp基本表格和简单算法表格

基本表格&#xff1b; <% 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. 二次型化为标准型 和第五章有什么样的联系 首先上一章我们说过对于对称矩阵&#xff0c;一定存在一个正交矩阵Q&#xff0c;使得$Q^{-1}AQB $ B为对角矩阵 那么这一章中&#xff0c;我们…...

Kotlin系列之注解详解

目录 注解&#xff1a;file:JvmName 注解&#xff1a;JvmField 注解&#xff1a;JvmOverloads 注解&#xff1a;JvmStatic 注解&#xff1a;JvmMultifileClass 注解&#xff1a;JvmSynthetic 注解&#xff1a;file:JvmName file:JvmName(“XXX”) 放在类的最顶层&#x…...

Go 面向对象,多态,基本数据类型

程序功能解读 第一行为可执行程序的包名&#xff0c;所有的Go源文件头部必须有一个包生命语句&#xff0c;Go通过包名来管理命名空间。 第三行import是引用外部包的说明 func关键字声明定义一个函数&#xff0c;如果是main则代表是Go程序入口函数 Go源码特征解读 源程序以.g…...

使用 Python修改JSON 文件中对应键值

文章目录 前言代码分析 前言 在日常的数据处理工作中&#xff0c;经常需要对 JSON 文件进行读取和修改。在 Python 中&#xff0c;处理 JSON 文件非常方便。本文将通过一个简单的示例程序来演示如何读取和修改 JSON 文件。 代码分析 首先&#xff0c;需要导入 json 和 os 模块…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...