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

未完待续~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据仓库】数仓分层方法详解与层次调用规范

文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层&#xff1f;1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…

Oracle使用块更改跟踪改善增量备份的性能

1.概述 增量备份的块更改跟踪功能&#xff0c;通过在块更改跟踪文件中的每个数据文件中记录更改的块来提高增量备份的性能。 此文件是存储在数据库区域中的小型二进制文件。 RMAN在生成重做时&#xff0c;跟踪更改的块。 如启用了块更改跟踪&#xff0c;则RMAN将使用更改跟踪文…

2023NOIP A层联测31 总结

T1 有一个长为 n n n 的序列 { a i } \{a_i\} {ai​}&#xff0c;你可以操作若干次&#xff1a;选择一个 i i i&#xff0c;花费 c x c_x cx​ 元将 a i a_i ai​ 变为 ⌊ a i x ⌋ ⌊\frac{a_i}x⌋ ⌊xai​​⌋&#xff0c;你总共有 K K K 元。问最终序列的中位数最小…

25.4 MySQL 函数

1. 函数的介绍 1.1 函数简介 在编程中, 函数是一种组织代码的方式, 用于执行特定任务. 它是一段可以被重复使用的代码块, 通常接受一些输入(参数)然后返回一个输出. 函数可以帮助开发者将大型程序分解为更小的, 更易于管理的部分, 提高代码的可读性和可维护性.函数在编程语言…

[01]汇川IMC30G-E系列运动控制卡应用笔记

简介 IMC30G-E系列产品是汇川技术自主研制的高性能EtherCAT网络型运动控制器&#xff08;卡&#xff09;&#xff0c;同时兼容脉冲轴的控制&#xff1b;IMC30G-E支持点位/JOG、插补、多轴同步、高速位置比较输出、PWM等全面的运动控制功能&#xff0c;具备高同步控制精度。 开发…

Leetcode 160. 相交链表

1. 题解 将null也作为了一种节点&#xff0c;所以&#xff0c;当两条链表是平行的话&#xff0c;最终他们也都会指向null值这个虚拟节点上。 curA 指向 链表A curB 指向 链表B 如果走到结尾 指向另一链表的首部重新走 curA 走了 a c b curB 走了 b c a注意&#xff1a;关…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号&#xff1f; 在OpenWrt路由器上&#xff0c;如何修改Web访问端口号&#xff0c;通常涉及到修改HTTP服务器的配置文件。默认情况下&#xff0c;OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤&#xff1a; 一、通过…

Dell笔记本电脑 启动时提示解决

https://www.dell.com/support/kbdoc/en-us/000139731/what-the-headless-operation-mode-active-post-message-means-and-how-to-stop-it-appearing-during-start-up dell官方解释&#xff1a; 提示来自于BIOS/UEFI固件中POST Behaviar&#xff0c;只要打开了忽略警告、错误…

Linux编辑器:vim的简单介绍及使用

目录 1.什么是vim 2.vim的基本概念 3.vim 的基本操作 4. 各模式下的命令集 4.1 正常模式命令集 4.2 末行模式命令集 5.补充 5.1 vim支持多文件编辑 5.2 vim 的配置 1.vim 配置原理 2. 常用简单配置选项&#xff1a; 3. 使用插件 1.什么是vim Vim 是从 vi 发展出…

Easyui DataGrid combobox联动下拉框内容

发票信息下拉框联动&#xff0c;更具不同的发票类型&#xff0c;显示不同的税率 专票 普票 下拉框选择事件 function onSelectType(rec){//选中值if (rec2){//普通发票对应税率pmsPlanList.pmsInvoiceTaxRatepmsPlanList.pmsInvoiceTaxRateT}else {//专用发票对应税率pmsPlan…

python十一天

1.不死兔子&#xff1a; # 不死兔子# 现有一只兔子&#xff0c;过四个月就会成熟&#xff0c;生小兔子&#xff0c;小兔子四个月后也会成熟 # 假设兔子不会死亡&#xff0c;一段时间&#xff0c;一共有多少只兔子 month int(input("输入&#xff1a;"))def get_rob…

nmap原理与使用

kali的命令行中可以直接使用 nmap 命令&#xff0c;打开一个「终端」&#xff0c;输入 nmap 后回车&#xff0c;可以看到 nmap 的版本&#xff0c;证明 nmap 可用。 一、端口扫描 扫描主机的「开放端口」&#xff0c;在nmap后面直接跟主机IP&#xff08;默认扫描1000个端口&am…

25 kafka消费者组重平衡

触达与通知 1.位置主题&写调整复习 (TODO) 2.重平衡是通过心跳线程的心跳请求来通知的&#xff0c;需要重平衡则请求响应REBALANCE_IN_PROGRESS。0.10.1.0版本后心跳线程和消息消费线程分离&#xff0c;避免了消息消费时间长影响心跳。heartbeat.interval.ms参数控制心跳请…

SQL使用

--天空会的像哭过&#xff0c;离开你以后 并没有更自由 SQL进行数据的删除 一、删除delete 语法 delete [from] 表名称 where 条件数据删除&#xff0c;不能删除某一列&#xff0c;因为删除是对记录而言 2.1 删除是一条一条删除&#xff0c;每次删除都会将操作写入日志文件 删…

2023.11.14联赛总结

T 1 T_1 T1​给出一个长度为 n n n的序列&#xff0c;你可以进行若干次操作&#xff0c;每次花费 c j c_j cj​元将 a i a_i ai​变为 ⌊ a i j ⌋ \lfloor \frac{a_i}{j} \rfloor ⌊jai​​⌋&#xff0c;你一共有 k k k元。问最终序列的中位数最小是多少。 其中 1 ≤ n , m …

个体诊所电子处方系统设计,诊所电子处方模板,药店电子处方系统,佳易王电子处方管理系统V16.0下载

个体诊所电子处方系统设计&#xff0c;诊所电子处方模板&#xff0c;药店电子处方系统&#xff0c;佳易王电子处方管理系统V16.0下载 软件支持配方模板&#xff0c;病人病历记录查询等&#xff0c;软件打印处方单所用的纸张为 A5纸。软件可以下载试用&#xff0c;点击最下方官网…

C++设计实现日志系统

转载&#xff1a;C设计实现日志系统 - 知乎 (zhihu.com) 日志系统几乎是每一个实际的软件项目从开发、测试到交付&#xff0c;再到后期的维护过程中极为重要的 查看软件代码运行流程、 还原错误现场、 记录运行错误位置及上下文等的重要依据。一个高性能的日志系统&#xff0c…

Windows上基于Tesseract OCR5.0官方语言库的LSTM字库训练

系列文章目录 Tesseract OCR引擎 文章目录 系列文章目录前言一、LSTM字库训练是什么&#xff1f;二、使用步骤1. 环境准备1.1下载Tesseract 程序并安装1.2下载Tesseract 训练字库1.3下载工具jTessBoxEditor 2. LSTM训练2.1 将要训练的图片(jpg/tif)合并成一个文件2.2 生成box文…

2、灰度图

上一篇文章中,我们解释了像素是计算机视觉任务中的原材料,很多图像处理任务以像素局部性为基础,在不同尺度下完成图像特征的提取,小则为图像细节,大则为图像轮廓。 现在继续看一种十分简洁但很高效的图像表示——灰度图,,灰度图是一种只包含亮度信息而不包含颜色信息的…

未来之路:大模型技术在自动驾驶的应用与影响

本文深入分析了大模型技术在自动驾驶领域的应用和影响&#xff0c;万字长文&#xff0c;慢慢观看~ 文中首先概述了大模型技术的发展历程&#xff0c;自动驾驶模型的迭代路径&#xff0c;以及大模型在自动驾驶行业中的作用。接着&#xff0c;详细介绍了大模型的基本定义、基础功…