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

news2025/1/19 0:30:16

一、实验目的

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.coloradmin.cn/o/2278699.html

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

相关文章

C#轻松实现条形码二维码生成及识别

一、前言 大家好&#xff01;我是付工。 今天给大家分享一下&#xff0c;如何基于C#来生成并识别条形码或者二维码。 二、ZXing.Net 实现二维码生成的库有很多&#xff0c;我们这里采用的是http://ZXing.Net。 ZXing是一个开放源码的&#xff0c;用Java实现的多种格式的一…

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

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

ASP.NET Core - 依赖注入(三)

ASP.NET Core - 依赖注入&#xff08;三&#xff09; 4. 容器中的服务创建与释放 4. 容器中的服务创建与释放 我们使用了 IoC 容器之后&#xff0c;服务实例的创建和销毁的工作就交给了容器去处理&#xff0c;前面也讲到了服务的生命周期&#xff0c;那三种生命周期中对象的创…

高通8255 Android STR 启动失败要因分析调查

目录 背景&#xff1a; 调查过程&#xff1a; 步骤1&#xff1a; slog2info | grep vmm_service 步骤2&#xff1a; slog2info | grep qvm 总结&#xff1a; 解决方案 背景&#xff1a; 调试高通8255 STR的STR过程中发现Android和QNX进入STR状态后&#xff0c;脱出STR时…

Linux操作命令之云计算基础命令

一、图形化界面/文本模式 ctrlaltF2-6 图形切换到文本 ctrlalt 鼠标跳出虚拟机 ctrlaltF1 文本切换到图形 shift ctrl "" 扩大 ctrl "-" 缩小 shift ctrl "n" 新终端 shift ctrl "t" 新标签 alt 1,…

LabVIEW桥接传感器配置与数据采集

该LabVIEW程序主要用于配置桥接传感器并进行数据采集&#xff0c;涉及电压激励、桥接电阻、采样设置及错误处理。第一个VI&#xff08;"Auto Cleanup"&#xff09;用于自动清理资源&#xff0c;建议保留以确保系统稳定运行。 以下是对图像中各个组件的详细解释&#…

面试题解析

1、写一个sed命令&#xff0c;修改/tmp/input.txt文件的内容 要求&#xff1a; 删除所有空行&#xff1b; 在非空行前面加一个"AAA"&#xff0c;在行尾加一个"BBB"&#xff0c;即将内容为11111的一行改为&#xff1a;AAA11111BBB 创造测试文件&#xff1a;…

合合信息名片全能王上架原生鸿蒙应用市场,成为首批数字名片类应用

长期以来&#xff0c;名片都是企业商务沟通的重要工具。随着企业数字化转型&#xff0c;相较于传统的纸质名片&#xff0c;数字名片对于企业成员拓展业务、获取商机、提升企业形象等方面发挥着重要作用。近期&#xff0c;合合信息旗下名片全能王正式上线原生鸿蒙应用市场&#…

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维修技师》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维修技师》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;北方联合出版传媒&#xff08;…

【OpenCV(C++)快速入门】--opencv学习

0 配置环境 配置环境网上很多资料&#xff0c;这里就不赘述了。 笔者使用的是VS2022opencv4.9.0 测试配置环境 // 打开摄像头样例 #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgcodecs/imgcod…

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…

网安快速入门之Windows命令

在Windows中 我们今天介绍几个命令&#xff1a; help copy dir cd type del ipconfig net netstat tasklist sc1. help 显示命令的帮助信息。或者显示Windows内置命令。 常用参数&#xff1a; <命令>&#xff1a;查看指定命令的帮助。 示例&#xff1a;help copy 显…

python convert.py -s Rubble

E0222 12:08:50.144686 1326795 logging.cc:56] [option_manager.cc:813] Check failed: ExistsDir(*image_path) E0222 12:08:50.144773 1326795 option_manager.cc:879] Invalid options provided. ERROR:root:Feature extraction failed with code 256. Exiting.在运行pytho…

[BrainShadow-V1] VR头戴设备统计报告

Brain-Shadow-V1 EventVR headsetsReported byXiao enDate2025/01/15Version1.0 HTC Vive Pro 2 Pro HTC Vive Pro 2 是一款高端虚拟现实头显&#xff0c;配备双 2.5K 显示屏&#xff0c;组合分辨率达到 48962448&#xff0c;提供 120 的视场角和 120Hz 的刷新率。该设备支持…

多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)

文章目录 1.背景2.问题分析3.解决方案3.1解决思路3.2解决过程3.2.1 封装播放组件3.2.2 隐形的视频div3.2.3 截取封面图 3.3 结束 1.背景 有这样一个需求&#xff1a; 给你一个监控列表&#xff0c;每页展示多个监控&#xff08;至少12个&#xff0c;m3u8格式&#xff09;&…

Golang Gin系列-2:搭建Gin 框架环境

开始网络开发之旅通常是从选择合适的工具开始的。在这个全面的指南中&#xff0c;我们将引导你完成安装Go编程语言和Gin框架的过程&#xff0c;Gin框架是Go的轻量级和灵活的web框架。从设置Go工作空间到将Gin整合到项目中&#xff0c;本指南是高效而强大的web开发路线图。 安装…

日志收集Day001

1.ElasticSearch 作用&#xff1a;日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml&#xff08;这里yy做了别名&#xff0c;过滤掉空行和注释行&#xff09; yy /etc/el…

SW - 快捷键

文章目录 SW - 快捷键概述笔记视图缩放视图平移视图旋转END SW - 快捷键 概述 鼠标中键不好使了&#xff0c;导致鼠标滚轮的操作在SW中不好使。 已经拆过鼠标&#xff0c;清理过中键计数轮那里的灰尘。只好用几天&#xff0c;然后鼠标中键又不好使了。 先查一下能代替鼠标中键…

Freeswitch使用media_bug能力实现回铃音检测

利用freeswitch的media bug能力来在智能外呼时通过websocket对接智能中心的声音检测接口,来实现回铃音检测,来判断用户当前是否已响应,拒接,关机等。 1.回铃音处理流程 2.模块源码目录结构 首先新建一个freeswitch的源码的src/application目录下新建一个子目录mod_ringba…