12.22熟悉常用的HBase操作2

news/2025/1/2 18:31:15/文章来源:https://www.cnblogs.com/yindantong/p/18642863

(二)HBase数据库操作

1. 现有以下关系型数据库中的表和数据(见表14-3到表14-5,要求将其转换为适合于HBase存储的表并插入数据:

14-3 学生表(Student

学号(S_No

姓名(S_Name

性别(S_Sex

年龄(S_Age

2015001

Zhangsan

male

23

2015002

Mary

female

22

2015003

Lisi

male

24

 

14-4 课程表(Course

课程号(C_No

课程名(C_Name

学分(C_Credit

123001

Math

2.0

123002

Computer Science

5.0

123003

English

3.0

 

14-5 选课表(SC

学号(SC_Sno

课程号(SC_Cno

成绩(SC_Score

2015001

123001

86

2015001

123003

69

2015002

123002

77

2015002

123003

99

2015003

123001

98

2015003

123002

95

 

 

 

 

 

 

 

 

 

2. 请编程实现以下功能:

1createTable(String tableName, String[] fields)

创建表,参数tableName为表的名称,字符串数组fields为存储记录各个字段名称的数组。要求当HBase已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表。

2addRecord(String tableName, String row, String[] fields, String[] values)

向表tableName、行row(用S_Name表示)和字符串数组fields指定的单元格中添加对应的数据values。其中,fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”“Computer Science”“English”三列添加成绩时,字符串数组fields{“Score:Math”, ”Score:Computer Science”, ”Score:English”},数组values存储这三门课的成绩。

3scanColumn(String tableName, String column)

浏览表tableName某一列的数据,如果某一行记录中该列数据不存在,则返回null。要求当参数column为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数column为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。

4modifyData(String tableName, String row, String column)

修改表tableName,行row(可以用学生姓名S_Name表示),列column指定的单元格的数据。

5deleteRow(String tableName, String row)

删除表tableNamerow指定的行的记录。

HBase操作类

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.client.Admin;

import org.apache.hadoop.hbase.client.Connection;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Delete;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.client.Table;

import org.apache.hadoop.hbase.client.TableDescriptor;

import org.apache.hadoop.hbase.client.TableDescriptorBuilder;

import org.apache.hadoop.hbase.util.Bytes;

 

public class HBaseOperations {

    private Connection connection;

 

    public HBaseOperations() throws Exception {

        org.apache.hadoop.conf.Configuration config = HBaseConfiguration.create();

        this.connection = ConnectionFactory.createConnection(config);

    }

 

    public void createTable(String tableName, String[] fields) throws Exception {

        try (Admin admin = connection.getAdmin()) {

            if (admin.tableExists(Bytes.toBytes(tableName))) {

                admin.disableTable(Bytes.toBytes(tableName));

                admin.deleteTable(Bytes.toBytes(tableName));

            }

            TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(Bytes.toBytes(tableName))

                    .setColumnFamily(ColumnFamilyDescriptorBuilder.of("info"))

                    .build();

            admin.createTable(tableDescriptor);

        }

    }

 

    public void addRecord(String tableName, String row, String[] fields, String[] values) throws Exception {

        try (Table table = connection.getTable(Bytes.toBytes(tableName))) {

            Put put = new Put(Bytes.toBytes(row));

            for (int i = 0; i < fields.length; i++) {

                String[] parts = fields[i].split(":");

                String columnFamily = parts[0];

                String column = parts.length > 1 ? parts[1] : null;

                if (column != null) {

                    put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(values[i]));

                }

            }

            table.put(put);

        }

    }

 

    public void scanColumn(String tableName, String column) throws Exception {

        try (Table table = connection.getTable(Bytes.toBytes(tableName))) {

            Scan scan = new Scan();

            if (column.contains(":")) {

                scan.addColumn(Bytes.toBytes(column.split(":")[0]), Bytes.toBytes(column.split(":")[1]));

            } else {

                scan.addFamily(Bytes.toBytes(column));

            }

            ResultScanner scanner = table.getScanner(scan);

            for (Result result : scanner) {

                System.out.println(result);

            }

        }

    }

 

    public void modifyData(String tableName, String row, String column, String newValue) throws Exception {

        try (Table table = connection.getTable(Bytes.toBytes(tableName))) {

            Put put = new Put(Bytes.toBytes(row));

            String[] parts = column.split(":");

            String columnFamily = parts[0];

            String columnQualifier = parts.length > 1 ? parts[1] : null;

            if (columnQualifier != null) {

                put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnQualifier), Bytes.toBytes(newValue));

                table.put(put);

            }

        }

    }

 

    public void deleteRow(String tableName, String row) throws Exception {

        try (Table table = connection.getTable(Bytes.toBytes(tableName))) {

            Delete delete = new Delete(Bytes.toBytes(row));

            table.delete(delete);

        }

    }

 

    public void close() throws Exception {

        if (connection != null) {

            connection.close();

        }

    }

}

Main类:

public class Main {

    public static void main(String[] args) {

        try {

            HBaseOperations hBaseOps = new HBaseOperations();

 

            // 创建表

            String[] fields = {"Score:Math", "Score:Computer Science", "Score:English"};

            hBaseOps.createTable("student", fields);

 

            // 添加记录

            String[] values = {"86", "77", "99"};

            hBaseOps.addRecord("student", "Mary", fields, values);

 

            // 扫描列

            hBaseOps.scanColumn("student", "Score");

 

            // 修改数据

            hBaseOps.modifyData("student", "Mary", "Score:Math", "90");

 

            // 删除行

            hBaseOps.deleteRow("student", "Mary");

 

            hBaseOps.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

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

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

相关文章

12.15熟悉常用的Linux操作和Hadoop操作1

1.实验目的 Hadoop运行在Linux系统上,因此,需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作,为顺利开展后续其他实验奠定基础。 2.实验平台 (1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04); (2)Hadoop版本:3.1.3。 3.实验步骤 1.熟…

某乎搜索接口加密参数分析

打开某乎,打开浏览器开发者工具,某乎主页随便搜索一个词,如 hello,找到接口如下: aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM/ 该接口为 GET 请求,url 参数未加密,请求头参数有几个未知,如 x-zse-93,x-zse-96,x-zst-81,经测试,请求头必带的参数有 cooki…

JVM实战—5.G1垃圾回收器的原理和调优

大纲 1.G1垃圾回收器的工作原理 2.G1分代回收原理—性能为何比传统GC好 3.使用G1垃圾回收器时应如何设置参数 4.如何基于G1垃圾回收器优化性能 5.问题汇总1.G1垃圾回收器的工作原理 (1)ParNew + CMS的组合有哪些痛点 (2)G1垃圾回收器 (3)G1如何实现垃圾回收的停顿时间是可控的 …

大模型--稚晖君开源百万机器人真机数据集 - HPT 具身智能03--43

目录1. 参考2. AgiBot World 数据集1. Arm(手臂)2. Waist(腰部)3. Chassis(底盘)4. Head(头部)5. End-Effector(末端执行器)6. Computing Platform(计算平台)7. Emergency Stop Button(紧急停止按钮)8. Touchscreen Display(触摸屏显示)9. Back Sensor(后部传…

基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信号频率

1.算法运行效果图预览 (完整程序运行后无水印)输出方波输出脉冲波 输出m随机序列输出正弦波2.算法运行软件版本 vivado2019.23.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)//the module of juxin signal signal_jux signal_jux_u(.i_clk (clk_low),.i_rst …

Vue-cli脚手架安装介绍

1、安装Vue-cli 可以使用npm或cnpm安装vue-cli项目构想工具 # 添加国内淘宝镜像加速 sudo npm config set registry https://registry.npmmirror.com/ sudo npm install -g @vue/cli 或使用 # 添加国内淘宝镜像加速 sudo npm install -g cnpm --registry https://registry.npmm…

一名程序员决定学点会计基础知识

1. 概述 企业是一种以营利(即获取经济利润)为目的的经济组织。在会计看来,企业一辈子其实只做了三件事:经营、投资和筹资。 在正常情况下,企业的经济活动是一个川流不息的过程。这一过程也是运用、分配及耗用企业经济资源的过程 。由于资金是企业经济资源的货币表现形式或…

追光记——2024软件工程秋个人总结报告

软件工程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业目标 软件工程个人总结学号 102201311一、学期回顾 1.1 SE之初印象 论:大三上最难的一门课是哪个? 操作系统吧,毕竟是408要求的大课 数据库也算合…

ov5640_lcd_display学习笔记

最近学习了正点原子fpga ov5640摄像头显示例程,特此记录一下。 系统框架与接口FPGA要操控的外围器件为ov5640摄像头、LCD和DDR3,接口方面也并不算复杂,用到的接口为sccb、dvp以及RGB888。 sccb接口用来配置摄像头寄存器参数,并且iic兼容sccb,所以配置寄存器直接调用iic的驱…

《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群

《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群@目录二、高级篇(大厂进阶)1.Docker复杂安装详说1.1安装mysql主从复制1.2安装redis集群1.2.1面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例哈希取余分区一致性哈希算法分区…

ThreeJs-10光线投射与物体交互

要拿到three中的物体去做出处理比如点击事件等等,那么需要类似于打一束光下来,穿透物体通过这个数组拿到先创建1000个立方体创建光线投射与物体交互大概步骤如下

【PHP开发】PHP后端基础

一、PHP 基本概念详解 PHP是一种服务器端脚本语言,常用于动态网站开发和 web 应用程序。以下是 PHP 的基本概念与特点的详细说明: 1.1 PHP 文件的默认文件扩展名 PHP 文件的扩展名通常为 .php,例如 index.php。 PHP 文件可以包含 PHP 代码、HTML、CSS 和 JavaScript。 Web 服…