HBase学习之HBaseAPI

HBase学习之HBaseAPI:

package com.shujia.base;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** 单元测试的注解:** @Before 在Test方法执行之前执行* @Test 在方法上定义,可以不用main方法,单独运行* @After 在Test方法执行之后执行* <p>* 使用java操作数据库,被称之为jdbc* 1、注册驱动* 2、创建与数据库的连接对象* 3、创建操作数据库的对象* 4、执行方法* 5、分析结果* 6、释放资源* hbase基础中要做的需求:* 1、如何创建一张表* 2、如何删除一张表* 3、如何向一张表中添加一条数据* 4、如何向一张表中同时添加一批数据* 5、如何获取一条数据* 6、如果获取一批数据* 7、如何创建预分region表*/
public class HbaseAPI {//成员变量private Connection conn;private Admin admin;@Beforepublic void connection() {try {//创建hbase的运行环境对象//旧版本的写法,已弃用
//        HBaseConfiguration conf = new HBaseConfiguration();//新版本创建配置文件对象的方式Configuration conf = HBaseConfiguration.create();//设置zookeeper的节点信息conf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");//创建hbase连接对象conn = ConnectionFactory.createConnection(conf);//创建数据库操作对象
//            HBaseAdmin hBaseAdmin = new HBaseAdmin(conn);admin = conn.getAdmin();System.out.println("成功获取数据库连接对象:" + conn);System.out.println("成功获取数据库操作对象:" + admin);System.out.println("=================================================");} catch (Exception e) {e.printStackTrace();}}/*** 如何创建一张表* 在hbase中创建一张表的必要因素是表名和列簇* create 'test2','info'*/@Testpublic void createOneTable() {/**在hbase中,表和列簇需要分开创建并设置,然后再将列簇对象添加到表中* 1、创建一个表的描述对象*///将表名封装成TableName的对象TableName name = TableName.valueOf("students");//在老版本中创建表描述器对象的方式 在2.0.0之后被弃用,将来会在3.0.0之后删除//public HTableDescriptor(final TableName name)
//        HTableDescriptor test2 = new HTableDescriptor(name);//新版本:推荐使用TableDescriptorBuilder来创建表描述器对象//public static TableDescriptorBuilder newBuilder(final TableName name)TableDescriptorBuilder test2 = TableDescriptorBuilder.newBuilder(name);try {/*** 2、创建一个列簇描述器对象*///旧版本的写法:public HColumnDescriptor(final String familyName) 在2.0.0之后被弃用,将来会在3.0.0之后删除
//        HColumnDescriptor info = new HColumnDescriptor("info");//新版本写法: ColumnFamilyDescriptorBuilder.of(String).ColumnFamilyDescriptor info = ColumnFamilyDescriptorBuilder.of("info");/*** 3、将列簇添加到表中*///旧版本的写法
//        test2.addColumnFamily(info);//新版本写法test2.setColumnFamily(info);/*** 判断表是否存在*/if (admin.tableExists(name)) {System.out.println(Bytes.toString(name.getName()) + " 表已经存在!");return;}/*** 4、admin对象调用方法创建一张表*///void createTable(TableDescriptor desc)//TableDescriptorBuilder://public TableDescriptor build() {//    return new ModifyableTableDescriptor(desc);//  }admin.createTable(test2.build());System.out.println(Bytes.toString(test2.build().getTableName().getName()) + "表创建 成功 SUCCEED!");} catch (Exception e) {System.out.println(Bytes.toString(test2.build().getTableName().getName()) + "表创建 失败!FAILED!");e.printStackTrace();}}/*** 2、如何删除一张表*/@Testpublic void deleteOneTable() {try {//将表名封装成一个TableName对象TableName name = TableName.valueOf("test2");/*** 判断表是否存在*/if (!admin.tableExists(name)) {System.out.println(Bytes.toString(name.getName()) + " 表不存在!无法删除!");return;}//禁用表admin.disableTable(name);//删除表admin.deleteTable(name);System.out.println(Bytes.toString(name.getName()) + "表删除 成功 SUCCEED!");} catch (Exception e) {e.printStackTrace();}}/*** 3、如何向一张表中添加一列数据* 1500100001,施笑槐,22,女,文科六班* <p>* put 'students','1500100001','info:name','施笑槐'* put 'students','1500100001','info:age','22'* put 'students','1500100001','info:gender','女'* put 'students','1500100001','info:clazz','文科六班'*/@Testpublic void putOneColData() {try {//将表名封装成一个TableName对象TableName name = TableName.valueOf("students");/*** 判断表是否存在*/if (!admin.tableExists(name)) {System.out.println(Bytes.toString(name.getName()) + " 表不存在!无法添加数据!");return;}//获取表实例对象Table test2 = conn.getTable(name);//将一列数据封装成一个Put对象,传入一个行键,需要将行键变成一个字节数组的格式Put put = new Put(Bytes.toBytes("1500100001"));//设置列簇列名和列值//public Put addColumn(byte [] family, byte [] qualifier, byte [] value)//设置的方式1:
//            put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"),Bytes.toBytes("施笑槐"));//设置的方式2:// public Put add(Cell cell)//KeyValue类是Cell接口的实现类//public KeyValue(final byte [] row, final byte [] family, final byte [] qualifier, final byte [] value)KeyValue keyValue = new KeyValue(Bytes.toBytes("1500100001"),Bytes.toBytes("info"),Bytes.toBytes("age"),Bytes.toBytes("22"));put.add(keyValue);//表对象调用put方法将一列或多列数据添加到表中//default void put(Put put)test2.put(put);System.out.println("一列数据添加完毕!");} catch (Exception e) {e.printStackTrace();}}/*** 4、如何向一张表中同时添加一批数据*/@Testpublic void putMoreData() {ArrayList<Put> puts = new ArrayList<>();try {//将表名封装成一个TableName对象TableName tableName = TableName.valueOf("students");/*** 判断表是否存在*/if (!admin.tableExists(tableName)) {System.out.println(Bytes.toString(tableName.getName()) + " 表不存在!无法添加数据!");return;}//获取表实例对象Table students = conn.getTable(tableName);//InputStreamReader//FileReader//BufferedReader//创建字符缓冲输入流对象BufferedReader br = new BufferedReader(new FileReader("data/students.txt"));String line = null;Put put = null;while ((line = br.readLine()) != null) {//1500100001,施笑槐,22,女,文科六班String[] infos = line.split(",");byte[] rk = Bytes.toBytes(infos[0]);byte[] name = Bytes.toBytes(infos[1]);put = new Put(rk);put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), name);puts.add(put);byte[] age = Bytes.toBytes(infos[2]);put = new Put(rk);put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), age);puts.add(put);byte[] gender = Bytes.toBytes(infos[3]);put = new Put(rk);put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), gender);puts.add(put);byte[] clazz = Bytes.toBytes(infos[4]);put = new Put(rk);put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("clazz"), clazz);puts.add(put);}students.put(puts);System.out.println(Bytes.toString(tableName.getName()) + " 表所有列数据添加完毕!!");} catch (Exception e) {e.printStackTrace();}}/*** 5、如何获取一条数据* get 'students','1500100001','info:name'*/@Testpublic void getOneData() {try {//将表名封装成一个TableName对象TableName tableName = TableName.valueOf("students");/*** 判断表是否存在*/if (!admin.tableExists(tableName)) {System.out.println(Bytes.toString(tableName.getName()) + " 表不存在!无法添加数据!");return;}//获取表实例对象Table students = conn.getTable(tableName);//创建一个Get对象Get get = new Get(Bytes.toBytes("1500100001"));//default Result get(Get get)Result result = students.get(get);/*** Hbase中Result类常用的方法:*  getRow() 获取行键的字节数组形式*  getValue(byte [] family, byte [] qualifier) 获取某一列值的字节数组形式*  listCells() 获取所有列单元格组成的List集合*///result中封装了许多的单元格,每一个单元格都是一个列//第一种获取数据的方式:列单独获取,getValue 获取一列数据的前提是要知道列簇和列名
//            String id = Bytes.toString(result.getRow());
//            String name = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));
//            String age = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")));
//            String gender = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("gender")));
//            String clazz = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("clazz")));
//            System.out.println("学号:" + id + ", 姓名:" + name + ", 年龄:" + age + ", 性别:" + gender + ", 班级:" + clazz);//第二种获取数据的方式:listCells()List<Cell> cells = result.listCells();for (Cell cell : cells) {//Hbase中提供了一个专门解析Cell单元格的工具类 CellUtilString id = Bytes.toString(CellUtil.cloneRow(cell));String cf = Bytes.toString(CellUtil.cloneFamily(cell));String colName = Bytes.toString(CellUtil.cloneQualifier(cell));String colValue = Bytes.toString(CellUtil.cloneValue(cell));System.out.println("行键:" + id + ", 列簇:" + cf + ", 列名:" + colName + ", 列值:" + colValue);System.out.println("--------------------------------------------");}} catch (Exception e) {e.printStackTrace();}}/*** 6、如果获取一批数据* <p>* scan 'students'* scan 'students',LIMIT=>5* scan 'students', STARTROW=>'1500100013', STOPROW=>'1500100021'*/@Testpublic void scanMoreData() {try {//将表名封装成一个TableName对象TableName tableName = TableName.valueOf("students");/*** 判断表是否存在*/if (!admin.tableExists(tableName)) {System.out.println(Bytes.toString(tableName.getName()) + " 表不存在!无法添加数据!");return;}//获取表实例对象Table students = conn.getTable(tableName);//创建一个Scan对象Scan scan = new Scan(); //默认是查询所有行数据//可以对scan进行一些设置
//            scan.setLimit(5); //只查询前5行所有列数据//旧版本设置开始行行键和结束行键
//            scan.setStartRow(Bytes.toBytes("1500100013"));
//            scan.setStopRow(Bytes.toBytes("1500100021"));//新版本设置开始行行键和结束行键scan.withStartRow(Bytes.toBytes("1500100013"));//新版本中可以设置是否包含边界行scan.withStopRow(Bytes.toBytes("1500100021"), true);ResultScanner resultScanner = students.getScanner(scan);//获取一个迭代器对象,存放的是所有行的数据Iterator<Result> resultIterator = resultScanner.iterator();StringBuilder sb = null;while (resultIterator.hasNext()) {Result result = resultIterator.next();String id = Bytes.toString(result.getRow());
//                String name = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));
//                String age = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")));
//                String gender = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("gender")));
//                String clazz = Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("clazz")));
//                System.out.println("学号:" + id + ", 姓名:" + name + ", 年龄:" + age + ", 性别:" + gender + ", 班级:" + clazz);List<Cell> cells = result.listCells();sb = new StringBuilder();sb.append("id:").append(id).append(", ");for (int i = 0; i < cells.size(); i++) {//Hbase中提供了一个专门解析Cell单元格的工具类 CellUtilString colName = Bytes.toString(CellUtil.cloneQualifier(cells.get(i)));String colValue = Bytes.toString(CellUtil.cloneValue(cells.get(i)));if (i != cells.size() - 1) {sb.append(colName).append(":").append(colValue).append(", ");} else {sb.append(colName).append(":").append(colValue);}}System.out.println(sb);System.out.println("--------------------------------------------");}} catch (Exception e) {e.printStackTrace();}}/*** 7、如何创建预分region表*/@Testpublic void createSplitTable(){TableName name = TableName.valueOf("tb_split2");TableDescriptorBuilder test2 = TableDescriptorBuilder.newBuilder(name);try {ColumnFamilyDescriptor info = ColumnFamilyDescriptorBuilder.of("info");test2.setColumnFamily(info);if (admin.tableExists(name)) {System.out.println(Bytes.toString(name.getName()) + " 表已经存在!");return;}byte[][] splitKeys = {Bytes.toBytes("e"),Bytes.toBytes("h"),Bytes.toBytes("l"),Bytes.toBytes("r")};//createTable(TableDescriptor desc, byte[][] splitKeys)//指定分割键创建预分region表 'e','h','l','r'admin.createTable(test2.build(),splitKeys);System.out.println(Bytes.toString(test2.build().getTableName().getName()) + "表创建 成功 SUCCEED!");} catch (Exception e) {System.out.println(Bytes.toString(test2.build().getTableName().getName()) + "表创建 失败!FAILED!");e.printStackTrace();}}@Afterpublic void close() {if (admin != null) {try {admin.close();} catch (IOException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (IOException e) {e.printStackTrace();}}}}

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

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

相关文章

Unity制作透明材质直接方法——6.15山大软院项目实训

之前没有在unity里面接触过材质的问题&#xff0c;一般都是在maya或这是其他建模软件里面直接得到编辑好材质的模型&#xff0c;然后将他导入Unity里面&#xff0c;然后现在碰到了需要自己在Unity制作透明材质的情况&#xff0c;所以先搜索了一下有没有现成的方法&#xff0c;很…

删除名为 `XXXX` 的 conda 环境的命令

要删除名为 musetalk 的 conda 环境,您可以使用以下命令: conda remove --name musetalk --all这个命令会删除 musetalk 环境及其中安装的所有包。 执行上述命令后,您可以使用 conda env list 命令验证该环境是否已被成功删除。 如果您想要保留该环境中安装的某些包,可以先使…

C++迈向精通:当我尝试修改虚函数表

尝试修改虚函数表 本期纯整活儿好吧&#xff01;&#xff01;&#xff01;&#xff01; 初衷 有一天我突然开始好奇虚函数表是否真的存在&#xff0c;于是我开始想是否能够从C中查看或者调用虚函数表中的内容。&#xff0c;于是有了下面的操作。 操作过程 起初我并没有思路…

使用net.sf.mpxj读取project的.mpp文件

1、导入.mpp文件 public void importMppFile(String updateType, MultipartFile multipartFile) {try (InputStream inputStream multipartFile.getInputStream()) {// 读取文件的组件MPPReader mppReader new MPPReader();// 注意&#xff0c;如果在这一步出现了读取异常&a…

神经网络模型---AlexNet

一、AlexNet 1.导入tensorflow库&#xff0c;这里给简称为tf库 import tensorflow as tf from tensorflow.keras import datasets, layers, modelsdatasets&#xff1a;是用于训练和测试机器学习模型的数据集合 layers&#xff1a;是构建神经网络模型的关键组成部分 models&a…

Golang并发控制的三种方案

Channel Channel是Go在语言层面提供的一种协程间的通信方式&#xff0c;我们可以通过在协程中向管道写入数据和在待等待的协程中读取对应协程的次数来实现并发控制。 func main() {intChan : make(chan int, 5)waitCount : 5for i : 0; i < waitCount; i {go func() {intC…

上海SNEC光伏展参展总结--安科瑞

安科瑞戴婷 Acrel-Fanny 今年的snec上海光伏展吸引了来自全球各地的光伏行业专业人士及爱好者&#xff0c;本次展会共有来自30多个国家和地区的超过2000家企业参展&#xff0c;展出的光伏产品涵盖了太阳能电池、太阳能组件、逆变器、太阳能辅助设备等众多领域。 随着近年来光…

Oracle中常用特殊字符chr值

在Oracle数据库中&#xff0c;特殊字符的chr值&#xff08;即字符与ASCII码之间的对应关系&#xff09;对于数据的处理和查询非常重要。以下是一些常见的特殊字符及其对应的chr值&#xff1a; 换行符&#xff08;LF&#xff09;&#xff1a; chr值&#xff1a;10 示例&#…

《收获,不止oracle》读书笔记一:oracle体系结构

从图中可以看出,oracle数据库是由实例和一组数据库文件组成。实例是由oracle开辟的内存区和一组后台进程组成的。

2024.6.18

Python的网络编程 网络四层 在开始前,我们需要先了解一下我们在网络通信过程中的四个层次 我们上网产生的数据都是经过协议栈一层一层的封装然后经网卡发送到网络&#xff0c;经网络发送到服务端&#xff0c;然后服务端又是一层一层的解封装拿到自己想要的数据。 我们学习的…

YOLOv8目标检测算法在地平线Bernoulli2架构BPU上高效部署参考(PTQ方案)30fps!

—— 以RDK X3为例&#xff0c;修改Head部分&#xff0c;8ms疾速Python后处理程序&#xff0c;30fps稳稳当当 本文在地平线对YOLOv8s的Backbone修改的基础上&#xff0c;提出一种在地平线Bernoulli2架构BPU上部署YOLOv8的后处理思路。使用640640分辨率&#xff0c;80类别基于C…

香橙派AIPro开机测试

资料准备&#xff1a; 香橙派官网资料下载链接&#xff1a;http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-AIpro.html 硬件准备 香橙派ai pro一个 32G sd卡&#xff0c;带出厂镜像 电源 鼠标 键盘 hdmi显示屏 测试介绍 由…

4418 android4.4 + 6818 android5.1 移植gps

网上已经有的移植的资料 目前 3399 的板子上 对已有的可运行的GPS 进行测试。 我这里的 rk3399 的板卡 , Android7 Android8 都是 可以运行 GPS 应用程序的。 使用的是 ttyS4 的节点。 问题: 我发现, 开机就删掉 ttyS4 节点,也是可以 打开应用的。并且可以正常运行。不…

【机器学习】使用Perceiver模型解决Transformer效率低下问题

1.引言 1.1.技术背景 Transformer在高维度输入上计算效率低下&#xff0c;制约了Transformer框架的应用和迭代&#xff1a; 内存消耗大&#xff1a; 当处理高维度输入&#xff0c;如长文本或高分辨率图像时&#xff0c;Transformer需要将模型参数和中间状态都保存到内存中。这…

MQTT协议与tcp/ip协议的区别

MQTT协议与TCP/IP协议在多个方面存在显著的区别。以下是对这些区别的清晰归纳和解释&#xff1a; 1.协议层次与定位&#xff1a; ① TCP/IP&#xff1a;是一个协议族&#xff0c;是互联网的基础协议套件&#xff0c;它定义了电子设备如何在网络上进行通信。TCP/IP协议由多个层…

could not be registered. A bean with that name has already been defined in file

今天在使用SpringBoot中的拦截器的功能是遇到了如下的BUG&#xff0c;为了让屏幕前的您尽快排雷&#xff0c;特此记录一下 &#xff0c;报错信息如下&#xff1a; Description:The bean noLoginInterceptor, defined in class path resource [com/zwl/crm/config/MyConfig.cla…

Dubbo的多协议支持与选择策略

Dubbo作为一款高性能、分布式服务框架&#xff0c;其设计初衷之一就是提供高度灵活性和可扩展性&#xff0c;特别是在服务通信协议方面。Dubbo支持多种协议&#xff0c;以适应不同的应用场景和需求。以下是关于Dubbo多协议支持的详细介绍及选择策略&#xff1a; 支持的协议类型…

图片怎么弄成黑白的?关于将图片改成黑白的几种方法

图片怎么弄成黑白的&#xff1f;黑白照片以其独特的艺术魅力和经典的视觉效果&#xff0c;依然在摄影和图像处理中占据重要地位。无论是为了追求怀旧的氛围&#xff0c;还是为了突出图像的构图和光影效果&#xff0c;许多人都希望将彩色图片转换成黑白图片。这不仅可以赋予图像…

通俗易懂的ChatGPT的原理简介

ChatGPT是一种基于语言模型的对话生成模型。它的原理是通过预训练和微调两个步骤来生成有意义的对话回复。 在预训练阶段&#xff0c;模型使用大量的公开文本数据集进行训练。它通过学习文本中的上下文关联和语言规律来构建一个深层神经网络模型。这个模型能够预测给定上文的下…

全网最强Spring教程 | 万字长文爆肝Spring(三)

Spring_day03 今日目标 理解并掌握AOP相关概念能够说出AOP的工作流程能运用AOP相关知识完成对应的案例编写重点掌握Spring的声明式事务管理 1&#xff0c;AOP简介 前面我们在介绍Spring的时候说过&#xff0c;Spring有两个核心的概念&#xff0c;一个是IOC/DI&#xff0c;一个…