HBase实训:纸币冠字号查询任务

一、实验目的

1.  理解分布式数据存储系统HBase的架构和工作原理。

2.  掌握HBase表的设计原则,能够根据实际业务需求设计合理的表结构。

3.  学习使用HBase Java API进行数据的插入、查询和管理。

4.  实践分布式数据存储系统在大数据环境下的应用,提升实际操作能力和问题解决能力。

二、安装配置HBase集群

1、安装并配置一个HBase集群,确保集群中的各个组件正常运行。

2、确保集群中的主节点(Master)和多个从节点(RegionServers)都可以正常通信。

三、设计HBase表结构

根据钞票交易数据的业务需求,设计合适的HBase表结构,考虑如何存储和检索钞票交易数据。

HBase表设计:

    表名:currency_transactions

    行键:<冠字号>#<交易时间>(确保唯一性,按时间查询)

    列族:

        info:存储钞票基本信息,如面额、交易金额。

        transaction:存储交易相关信息,如交易时间、交易地点、类型。

        meta:其他信息。

四、插入部分钞票交易数据并探索数据特征

1、将一部分钞票交易数据插入到设计的HBase表中。

(1)创建表:create 'currency_transactions', 'info', 'transaction', 'meta'

插入数据:

put 'currency_transactions', '123456ABC#20241201', 'info:denomination', '100'
put 'currency_transactions', '123456ABC#20241201', 'info:amount', '100'
put 'currency_transactions', '123456ABC#20241201', 'transaction:time', '2024-12-01 10:00'
put 'currency_transactions', '123456ABC#20241201', 'transaction:location', 'Beijing'
put 'currency_transactions', '123456ABC#20241201', 'transaction:type', 'Deposit'
put 'currency_transactions', '123456ABC#20241201', 'meta:notes', 'First deposit'

使用基础的HBase查询语句,探索钞票交易数据的结构和特征,确保数据可以正确存储和访问。

(1)查看表中所有数据:scan 'currency_transactions'

(2)查询特定行键的数据:

get 'currency_transactions', '123456ABC#20241201'

(3)查询特定列的数据:get 'currency_transactions', '123456ABC#20241201', 'transaction:location'

五、使用HBase Java API进行操作

1、创建Maven项目并添加相关依赖

(1)在IDEA上面新建Maven项目,下载与虚拟机中HBase一致的jdk版本1.8

(2)新建项目

(3)编辑pom.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>javaapi</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- HBase Client --><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.2.5</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies>
</project>
log4j.properties:
# Set root logger level and appender
log4j.rootLogger=INFO, console
# Console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

2、HBase Java API的基本操作之表的创建

(1)代码部分:

package com.example;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;import java.io.IOException;public class HBaseTableCreator {public static void main(String[] args) throws IOException {Configuration config = HBaseConfiguration.create();config.addResource(new Path("hbase-site.xml"));config.set("hbase.zookeeper.quorum", "192.168.125.101");config.set("hbase.zookeeper.property.clientPort", "2181");try (Connection connection = ConnectionFactory.createConnection(config);Admin admin = connection.getAdmin()) {TableName tableName = TableName.valueOf("currency_transactions");// 使用 HBase 1.x API 定义列族HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);tableDescriptor.addFamily(new HColumnDescriptor("info"));tableDescriptor.addFamily(new HColumnDescriptor("transaction"));tableDescriptor.addFamily(new HColumnDescriptor("meta"));// 检查表是否存在if (admin.tableExists(tableName)) {System.out.println("Table already exists. Deleting and recreating...");admin.disableTable(tableName);admin.deleteTable(tableName);}// 创建表admin.createTable(tableDescriptor);System.out.println("Table created successfully.");}}
}

(2)运行结果:

3、HBase Java API的基本操作——数据的插入

(1)代码部分:

package com.example;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;import java.io.IOException;public class HBaseDataInserter {public static void main(String[] args) throws IOException {// 配置 HBase 连接Configuration config = HBaseConfiguration.create();config.addResource(new Path("hbase-site.xml"));config.set("hbase.zookeeper.quorum", "192.168.125.101");config.set("hbase.zookeeper.property.clientPort", "2181");// 定义表名String tableName = "currency_transactions";try (Connection connection = ConnectionFactory.createConnection(config)) {// 插入多行数据addRows(connection, tableName);}}public static void addRows(Connection connection, String tableName) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {// 创建 Put 对象,插入行1 (Alice)Put put1 = new Put("row1".getBytes());put1.addColumn("info".getBytes(), "name".getBytes(), "Alice".getBytes());put1.addColumn("info".getBytes(), "age".getBytes(), "30".getBytes());put1.addColumn("transaction".getBytes(), "amount".getBytes(), "1000".getBytes());put1.addColumn("transaction".getBytes(), "currency".getBytes(), "USD".getBytes());// 创建 Put 对象,插入行2 (Bob)Put put2 = new Put("row2".getBytes());put2.addColumn("info".getBytes(), "name".getBytes(), "Bob".getBytes());put2.addColumn("info".getBytes(), "age".getBytes(), "40".getBytes());put2.addColumn("transaction".getBytes(), "amount".getBytes(), "500".getBytes());put2.addColumn("transaction".getBytes(), "currency".getBytes(), "EUR".getBytes());// 批量插入table.put(put1);table.put(put2);System.out.println("Rows added successfully.");}}
}

(2)运行结果:

4、根据冠字号(行键)查询单行数据

(1)实现代码

package com.example;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;import java.io.IOException;public class HBaseDataRetriever {public static void main(String[] args) throws IOException {// 配置 HBase 连接Configuration config = HBaseConfiguration.create();config.addResource(new Path("hbase-site.xml"));config.set("hbase.zookeeper.quorum", "192.168.125.101");config.set("hbase.zookeeper.property.clientPort", "2181");// 定义表名和行键(冠字号)String tableName = "currency_transactions";String rowKey = "row1"; // 冠字号对应的行键try (Connection connection = ConnectionFactory.createConnection(config)) {// 查询单行数据retrieveRowByKey(connection, tableName, rowKey);}}public static void retrieveRowByKey(Connection connection, String tableName, String rowKey) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {// 创建 Get 对象Get get = new Get(rowKey.getBytes());// 指定需要的列族和列(可选)get.addFamily("info".getBytes()); // 获取 "info" 列族的所有列get.addColumn("transaction".getBytes(), "amount".getBytes()); // 获取特定列// 获取结果Result result = table.get(get);// 遍历结果System.out.println("Row Key: " + rowKey);result.listCells().forEach(cell -> {String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());String qualifier = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());System.out.println(family + ":" + qualifier + " = " + value);});}}
}

(2)运行结果

5、批量检索所有数据(扫描)

(1)实现代码

package com.example;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;import java.io.IOException;public class HBaseDataScanner {public static void main(String[] args) throws IOException {// 配置 HBase 连接Configuration config = HBaseConfiguration.create();config.addResource(new Path("hbase-site.xml"));config.set("hbase.zookeeper.quorum", "192.168.125.101");config.set("hbase.zookeeper.property.clientPort", "2181");// 定义表名String tableName = "currency_transactions";try (Connection connection = ConnectionFactory.createConnection(config)) {// 扫描表数据scanTableData(connection, tableName);}}public static void scanTableData(Connection connection, String tableName) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {// 创建 Scan 对象Scan scan = new Scan();// 指定列族或列(可选)scan.addFamily("info".getBytes()); // 扫描 "info" 列族scan.addColumn("transaction".getBytes(), "currency".getBytes()); // 扫描特定列// 获取结果ResultScanner scanner = table.getScanner(scan);// 遍历结果for (Result result : scanner) {String rowKey = new String(result.getRow());System.out.println("Row Key: " + rowKey);result.listCells().forEach(cell -> {String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());String qualifier = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());System.out.println(family + ":" + qualifier + " = " + value);});System.out.println("------------");}}}
}

(2)运行结果

6、根据列值(如冠字号、金额等)过滤数据

(1)实现代码

package com.example;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.*;import org.apache.hadoop.hbase.filter.*;import java.io.IOException;public class HBaseFilteredScan {public static void main(String[] args) throws IOException {// 配置 HBase 连接Configuration config = HBaseConfiguration.create();config.addResource(new Path("hbase-site.xml"));config.set("hbase.zookeeper.quorum", "192.168.125.101");config.set("hbase.zookeeper.property.clientPort", "2181");// 定义表名String tableName = "currency_transactions";try (Connection connection = ConnectionFactory.createConnection(config)) {// 使用过滤器检索数据scanTableWithFilter(connection, tableName, "transaction", "currency", "USD");}}public static void scanTableWithFilter(Connection connection, String tableName, String columnFamily, String columnQualifier, String valueToFilter) throws IOException {try (Table table = connection.getTable(TableName.valueOf(tableName))) {// 创建 Scan 对象Scan scan = new Scan();// 添加列值过滤器SingleColumnValueFilter filter = new SingleColumnValueFilter(columnFamily.getBytes(),           // 列族columnQualifier.getBytes(),        // 列名CompareFilter.CompareOp.EQUAL,     // 比较操作valueToFilter.getBytes());         // 目标值// 设置过滤器scan.setFilter(filter);// 获取结果ResultScanner scanner = table.getScanner(scan);// 遍历结果for (Result result : scanner) {String rowKey = new String(result.getRow());System.out.println("Row Key: " + rowKey);result.listCells().forEach(cell -> {String family = new String(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());String qualifier = new String(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());String value = new String(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());System.out.println(family + ":" + qualifier + " = " + value);});System.out.println("------------");}}}
}

(2)运行结果

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

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

相关文章

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)

在HarmonyOS NEXT开发环境中&#xff0c;可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP&#xff0c;主要关注影视搜索页的功能实现。 为什么选择nutpi/axios&#xff1f; nutpi…

网络IO与IO多路复用

一、网络IO基础 系统对象&#xff1a; 网络IO涉及用户空间调用IO的进程或线程以及内核空间的内核系统。例如&#xff0c;当进行read操作时&#xff0c;会经历两个阶段&#xff1a; 等待数据准备就绪。将数据从内核拷贝到进程或线程中。 多种网络IO模型的出现原因&#xff1a;…

天机学堂3-ES+Caffeine

文章目录 day05-问答系统表 用户端分页查询问题目标效果代码实现 3.6.管理端分页查询问题ES相关 管理端互动问题分页实现三级分类3.6.5.2.多级缓存3.6.5.3.CaffeineTODO&#xff1a;使用Caffeine作为本地缓存&#xff0c;另外使用redis或者memcache作为分布式缓存&#xff0c;构…

重拾Python学习,先从把python删除开始。。。

自己折腾就是不行啊&#xff0c;屡战屡败&#xff0c;最近终于找到前辈教我 第一步 删除Python 先把前阵子折腾的WSL和VScode删掉。还是得用spyder&#xff0c;跟matlab最像&#xff0c;也最容易入手。 从VScode上搞python&#xff0c;最后安装到appdata上&#xff0c;安装插…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

flutter 装饰类【BoxDecoration】

装饰类 BoxDecoration BoxDecoration 是 Flutter 中用于控制 Container 等组件外观的装饰类&#xff0c;它提供了丰富的属性来设置背景、边框、圆角、阴影等样式。 BoxDecoration 的主要属性 1.color 背景颜色。类型&#xff1a;Color?示例&#xff1a; color: Colors.blu…

Datawhale-self-llm-Phi-4 Langchain接入教程

本项目是一个围绕开源大模型、针对国内初学者、基于 AutoDL 平台的中国宝宝专属大模型教程&#xff0c;针对各类开源大模型提供包括环境配置、本地部署、高效微调等技能在内的全流程指导&#xff0c;简化开源大模型的部署、使用和应用流程&#xff0c;让更多的普通学生、研究者…

某讯一面,感觉问Redis的难度不是很大

前不久&#xff0c;有位朋友去某讯面试&#xff0c;他说被问到了很多关于 Redis 的问题&#xff0c;比如为什么用 Redis 作为 MySQL 的缓存&#xff1f;Redis 中大量 key 集中过期怎么办&#xff1f;如何保证缓存和数据库数据的一致性&#xff1f;我将它们整理出来&#xff0c;…

Java技术栈 —— VMware WorkStation导入已有的虚拟机文件

Java技术栈 —— VMware WorkStation导入已有的虚拟机文件 FileInfo.com笔者转述 我下载了一个虚拟机镜像压缩包&#xff0c;解压之后&#xff0c;我发现了里面有五类文件&#xff0c;这五类文件的作用分别都是什么呢&#xff1f;哪个才是虚拟机文件的本体呢&#xff1f;要想自…

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)

本文项目编号 T 141 &#xff0c;文末自助获取源码 \color{red}{T141&#xff0c;文末自助获取源码} T141&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Ruby语言的循环实现

Ruby语言的循环实现深入探讨 在程序设计中&#xff0c;循环是一种常见的控制结构&#xff0c;用于重复执行某些代码块。不同的编程语言提供了不同类型的循环结构&#xff0c;以满足不同的需求。Ruby是一种灵活且易于使用的编程语言&#xff0c;其循环实现方式独具一格&#xf…

NVIDIA发布个人超算利器project digital,标志着ai元年的开启

上图NVIDIA公司创始人兼首席执行官 黄仁勋&#xff08;Jensen Huang&#xff09; 这些年被大家熟知的赛博朋克风格一直都是未来的代言词&#xff0c;可以承载人类记忆的芯片&#xff0c;甚至能独立思考的仿生人&#xff0c;现在&#xff0c;随着NVIDIA的project digital发布之后…

海云安开发者安全智能助手D10荣膺 “ AI标杆产品 ” 称号,首席科学家齐大伟博士入选2024年度 “ 十大杰出青年 ”

2024年12月27日&#xff0c;粤港澳大湾区AI领袖峰会在深圳成功举办&#xff0c;大会表彰了在人工智能技术创新、应用实践和产业发展等方面取得优异成绩的企业和个人&#xff0c;深圳海云安网络安全技术有限公司开发者安全智能助手D10荣膺“AI标杆产品”称号。同时&#xff0c;公…

ArkTS 组件事件、状态管理与资源管理

1. 组件事件 组件事件是在用户与界面交互时触发的操作&#xff0c;如点击、触碰、滑屏、按键等。在 ArkTS 中&#xff0c;通过为组件绑定事件处理函数&#xff0c;实现对用户交互的响应。 常用事件示例 事件类型描述示例onClick()点击事件Button().onClick(handler)onTouch(…

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…

.Net 学习指南与资料分享

.NET学习资料 .NET学习资料 .NET学习资料 在当今数字化时代&#xff0c;软件开发领域蓬勃发展&#xff0c;.NET 作为微软推出的强大开发平台&#xff0c;凭借其出色的性能、跨平台特性以及丰富的生态系统&#xff0c;在企业级应用、Web 应用、移动应用等众多领域都有着广泛的…

Docker Desktop 中安装 MySQL 并开启远程访问的详细教程

是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程&#xff1a; 一、安装 MySQL 容器 拉取 MySQL 镜像&#xff1a; docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL&#xff0c;可以将 latest 替换为具体…

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(六)

文章目录 一、考试管理模块实现1、添加考试功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、考试管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下载…