HBase高手之路5—HBase的JavaAPI编程

news2024/11/24 11:59:01

文章目录

  • Hbase高手之路5—Hbase的JavaAPI编程
    • 一、需求与数据集
    • 二、准备工作
      • 1.下载安装Java
      • 2.下载安装Idea
      • 3.下载安装maven
      • 4.Maven配置国内的镜像库
      • 5.Idea使用自定义的maven配置
      • 6.创建一个maven测试项目
      • 7.创建所需要的包
      • 8.创建类文件,输入代码
      • 9.运行项目
    • 三、创建HBase java api项目
      • 1.修改pom文件,导入HBase的Java API的依赖包
      • 2.创建HBase的连接类
      • 3.运行,查看结果
    • 四、案例一:使用HBase的Java API创建表
      • 1.主要步骤
      • 2.把hadoop的配置文件core-site.xml和HBase的配置文件hbase-site.xml复制到resources文件夹下,同时再添加一个日志文件log4j.properties
      • 3.编写代码
      • 4.运行,查看结果
      • 5.在HBase的shell中查看创建的表名
    • 五、案例二:删除创建的表
      • 1.主要步骤
      • 2.创建类,编写代码
    • 六、代码优化
      • 1.创建一个获取admin的类
      • 2.修改删除表的类的代码
      • 3.运行,查看结果
    • 七、代码继续优化
      • 1.创建一个主类,把前面的类的功能写成对应的方法
      • 2.main调用相应的方法实现操作
        • 2.1 创建表
        • 2.2 删除表
        • 2.3 进一步优化代码
    • 八、案例三:往创建的表中插入数据
      • 1.主要步骤
      • 2.创建方法,编写代码
      • 3.在main中调用插入数据的方法
      • 4.执行,查看结果
      • 5.作业:插入其他列的数据
      • 6.完整代码
    • 九、案例四:获取数据
      • 1.获取某一列的数据
        • 1)获取某一列的数据
        • 2)在main中调用用并执行,查看结果
      • 2.获取一行数据
      • 3.代码
    • 十、案例五:删除数据
    • 十一、案例六:导入大量的数据
      • 1.需求
      • 2.导入数据到HBase表中
      • 3.上传数据文件到hdfs上
      • 4.创建表
      • 5.启动yarn
      • 6.运行导入命令
      • 7.查看数据
      • 8.count计数
      • 9.mapreduce 计数
    • 十二、案例七:查询2020年6月份所有的用户的用水量
      • 1.需求分析
      • 2.编写代码
      • 3.在main中调用方法
      • 4.执行,查看结果
      • 5.用量及金额乱码,需要对代码进行改进
    • 十三、案例八:导出数据

image-20230220084553544

Hbase高手之路5—Hbase的JavaAPI编程

一、需求与数据集

某某自来水公司,需要存储大量的缴费明细数据。以下截取了缴费明细的一部分内容。

用户ID姓名地址性别缴费时间表示数(本次)表示数(上次)用量(立方)金额查表日期最近缴费日期
4944191张三石家庄市裕华区万达小区1-1-1012023-3-23308.1283.1251502023-3-232023-2-1

因为缴费明细的数据记录非常庞大,该公司的信息部门决定使用HBase来存储这些数据。并且,他们希望能够通过Java程序来访问这些数据。

二、准备工作

1.下载安装Java

下载jdk1.8

在这里插入图片描述

环境变量配置

在这里插入图片描述

2.下载安装Idea

下载社区版本就可以了。

在这里插入图片描述
在这里插入图片描述

3.下载安装maven

在这里插入图片描述
在这里插入图片描述

4.Maven配置国内的镜像库

打开配置文件:
在这里插入图片描述

配置阿里云镜像:

在这里插入图片描述

5.Idea使用自定义的maven配置

关闭所有的项目,在Idea的启动页

在这里插入图片描述
在这里插入图片描述

6.创建一个maven测试项目

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.创建所需要的包

在这里插入图片描述
在这里插入图片描述

8.创建类文件,输入代码

快捷键

  • psvm:

  • public static void main(String[] args) {
                    
    }
    
  • sout:System.out.println();

image-20230323100527587

9.运行项目

点击运行项目:

image-20230323100657381

查看输出结果:

image-20230323100757597

三、创建HBase java api项目

在测试项目的基础上

1.修改pom文件,导入HBase的Java API的依赖包

 	<dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.4.10</version>
        </dependency>
    </dependencies>

在这里插入图片描述

2.创建HBase的连接类

package cn.edu.hgu.bigdata20;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

import java.io.IOException;

public class Hello {
    public static void main(String[] args) {
        Configuration configuration = new Configuration();
        try {
            Connection connection = ConnectionFactory.createConnection(configuration);//工厂模式
            Admin admin = connection.getAdmin();
            System.out.println(admin);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

image-20230327122111811

3.运行,查看结果

image-20230327082107569

四、案例一:使用HBase的Java API创建表

创建一个名为water_bill的表,包含一个列簇info

1.主要步骤

  • 定义表名,判断表是否存在
  • 表描述构建器,建立表描述对象
  • 列簇描述构建器,建立列簇描述对象
  • 表描述对象和列簇描述对象建立关系
  • 创建表

2.把hadoop的配置文件core-site.xml和HBase的配置文件hbase-site.xml复制到resources文件夹下,同时再添加一个日志文件log4j.properties

先导出到本地计算机

image-20230327090756995

image-20230327091014204

image-20230327122534835

复制到resources文件夹下

image-20230327122600156

3.编写代码

创建CreateTable类,编写代码

package cn.edu.hgu.bigdata20;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * describe:创建表
 * author:王
 * date:2023/03/27
 */
public class CreateTable {
    public static void main(String[] args) {
        // 定义配置
        Configuration configuration = HBaseConfiguration.create();

        try {
            // 定义HBase连接
            Connection connection = ConnectionFactory.createConnection(configuration);//工厂模式
            // 定义Admin对象
            Admin admin = connection.getAdmin();
            System.out.println(admin);
            // 1.定义表名,判断表是否存在
            TableName tableName = TableName.valueOf("water_bill");
            // 2.表描述构建器
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);//构建器模式
            // 3.列簇描述构建器
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info"));
            // 3.1 定义列簇描述构建器,建立列簇描述对象
            ColumnFamilyDescriptor columnFamilyDescriptor = columnFamilyDescriptorBuilder.build();
            // 4.表描述对象和列簇描述对象建立关系
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
            // 定义表描述对象
            TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
            // 5.创建表
            admin.createTable(tableDescriptor);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

4.运行,查看结果

image-20230327094505500

5.在HBase的shell中查看创建的表名

image-20230327094619597

五、案例二:删除创建的表

删除刚刚创建的表

1.主要步骤

  • 定义表名,判断表是否存在
  • 如果表存在,禁用表
  • 删除表

2.创建类,编写代码

package cn.edu.hgu.bigdata20;

import javafx.scene.control.Tab;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

import java.io.IOException;

/**
 * describe:删除表
 * author:王
 * date:2023/03/27
 */
public class DeleteTable {
    public static void main(String[] args) throws IOException {
        // 1.创建hbase的配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.创建hbase的连接
        Connection connection = null;
        Admin admin = null;
        try {
            //通过工厂模式,根据配置来创建连接
            connection = ConnectionFactory.createConnection(configuration);
            //System.out.println(connection);
            // 3.创建admin对象
            admin = connection.getAdmin();
            //System.out.println(admin);
            // 1.定义表名,判断表是否存在
            TableName tableName = TableName.valueOf("water_bill");
            // 2.如果存在,禁用表
            if (admin.tableExists(tableName)) {
                //禁用表
                admin.disableTable(tableName);
                //3.删除表
                admin.deleteTable(tableName);
            } else {
                System.out.println("表不存在!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            admin.close();
            connection.close();
        }

    }
}

六、代码优化

因为每种操作都需要admin对象,可以将其拿出来,作为一个单独的类。

1.创建一个获取admin的类

package cn.edu.hgu.bigdata20;

import org.apache.hadoop.conf.Configuration;
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 java.io.IOException;

/**
 * describe:获取admin对象
 * author:王
 * date:2023/03/27
 */
public class GetAdmin {
    public static Admin getAdmin() throws IOException {
        // 1.创建hbase的配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.创建hbase的连接
        //通过工厂模式,根据配置来创建连接
        Connection connection = ConnectionFactory.createConnection(configuration);
        // 3.创建admin对象
        Admin admin = connection.getAdmin();
        // 4.返回创建的admin对象
        return admin;
    }
}

image-20230327124957729

2.修改删除表的类的代码

package cn.edu.hgu.bigdata20;

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

import java.io.IOException;

/**
 * describe:删除表
 * author:王
 * date:2023/03/27
 */
public class DeleteTable {
    public static void main(String[] args) throws IOException {
        // 通过静态类方法创建admin对象
        Admin admin = GetAdmin.getAdmin();
        // 1.定义表名,判断表是否存在
        TableName tableName = TableName.valueOf("water_bill");
        // 2.如果存在,禁用表
        if (admin.tableExists(tableName)) {
            //禁用表
            admin.disableTable(tableName);
            //3.删除表
            admin.deleteTable(tableName);
        } else {
            System.out.println("表不存在!");
        }
    }
}

image-20230327125311032

3.运行,查看结果

image-20230327125446943

image-20230327125538651

七、代码继续优化

1.创建一个主类,把前面的类的功能写成对应的方法

image-20230330095827480

image-20230330095942011

image-20230330100344629

image-20230330100038098

代码如下:

package cn.edu.hgu.bigdata20;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * describe:实现Hbase的增删改查
 * author:王
 * date:2023/3/30
 */
public class HBaseCRUD {
    // 主方法
    public static void main(String[] args) throws IOException {
        //创建表water_bill444
        createTable("water_bill444", "info");
        //删除表
        deleteTable("water_bill444");
    }

    /**
     * 获取admin
     */
    public static Admin getAdmin() throws IOException {
        // 1.创建hbase的配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.创建hbase的连接
        //通过工厂模式,根据配置来创建连接
        Connection connection = ConnectionFactory.createConnection(configuration);
        // 3.创建admin对象
        Admin admin = connection.getAdmin();
        // 4.返回创建的admin对象
        return admin;
    }

    /**
     * 创建表
     *
     * @return
     */
    public static boolean createTable(String tableName, String columnFamily) throws IOException {
        Admin admin = getAdmin();
        // 1.定义表名,判断表是否存在
        TableName table = TableName.valueOf(tableName);
        if (!admin.tableExists(table)) {
            // 2.表描述构建器
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(table);//构建器模式
            // 3.列簇描述构建器
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
            // 3.1 定义列簇描述构建器,建立列簇描述对象
            ColumnFamilyDescriptor columnFamilyDescriptor = columnFamilyDescriptorBuilder.build();
            // 4.表描述对象和列簇描述对象建立关系
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
            // 5.定义表描述对象
            TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
            // 6.创建表
            admin.createTable(tableDescriptor);
            return true;
        } else {
            return false;
        }

    }

    /**
     * 删除表
     */
    public static boolean deleteTable(String tableName) throws IOException {
        // 通过静态类方法创建admin对象
        Admin admin = GetAdmin.getAdmin();
        // 1.定义表名,判断表是否存在
        TableName table = TableName.valueOf(tableName);
        // 2.如果存在,禁用表
        if (admin.tableExists(table)) {
            //禁用表
            admin.disableTable(table);
            //3.删除表
            admin.deleteTable(table);
        } else {
            return false;
        }
        return true;
    }

    /**
     * 插入数据
     */
    public static boolean insertData() {
        return true;
    }
}

2.main调用相应的方法实现操作

2.1 创建表

image-20230330100132175

image-20230330100446519

image-20230330100514507

2.2 删除表

image-20230330100735971

image-20230330100759836

2.3 进一步优化代码

我们发现创建表和删除表方法中的admin是重复调用的,感觉比较浪费资源,我们可以先对使用初始化方法,初始化admin,其他的方法只需要调用这个静态变量就可以了,而不是调用getAdmin方法。

image-20230330101217733

image-20230330101542949

image-20230330101526498

代码如下:

package cn.edu.hgu.bigdata20;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * describe:实现Hbase的增删改查
 * author:王
 * date:2023/3/30
 */
public class HBaseCRUD {
    //定义admin对象
    public static Admin admin = null;

    // 主方法
    public static void main(String[] args) throws IOException {
        init();
        //创建表water_bill444
        createTable("water_bill444", "info");
        //删除表
        deleteTable("water_bill444");
    }

    /**
     * 初始化admin
     *
     * @throws IOException
     */
    public static void init() throws IOException {
        admin = getAdmin();
    }

    /**
     * 获取admin
     */
    public static Admin getAdmin() throws IOException {
        // 1.创建hbase的配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.创建hbase的连接
        //通过工厂模式,根据配置来创建连接
        Connection connection = ConnectionFactory.createConnection(configuration);
        // 3.创建admin对象
        Admin admin = connection.getAdmin();
        // 4.返回创建的admin对象
        return admin;
    }


    /**
     * 创建表
     *
     * @param tableName
     * @param columnFamily
     * @return
     * @throws IOException
     */
    public static boolean createTable(String tableName, String columnFamily) throws IOException {
        //Admin admin = getAdmin();
        // 1.定义表名,判断表是否存在
        TableName table = TableName.valueOf(tableName);
        if (!admin.tableExists(table)) {
            // 2.表描述构建器
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(table);//构建器模式
            // 3.列簇描述构建器
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
            // 3.1 定义列簇描述构建器,建立列簇描述对象
            ColumnFamilyDescriptor columnFamilyDescriptor = columnFamilyDescriptorBuilder.build();
            // 4.表描述对象和列簇描述对象建立关系
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
            // 5.定义表描述对象
            TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
            // 6.创建表
            admin.createTable(tableDescriptor);
            return true;
        } else {
            return false;
        }

    }

    /**
     * 删除表
     *
     * @param tableName
     * @return
     * @throws IOException
     */
    public static boolean deleteTable(String tableName) throws IOException {
        // 通过静态类方法创建admin对象
        //Admin admin = GetAdmin.getAdmin();
        // 1.定义表名,判断表是否存在
        TableName table = TableName.valueOf(tableName);
        // 2.如果存在,禁用表
        if (admin.tableExists(table)) {
            //禁用表
            admin.disableTable(table);
            //3.删除表
            admin.deleteTable(table);
        } else {
            return false;
        }
        return true;
    }

    /**
     * 插入数据
     */
    public static boolean insertData() {
        return true;
    }
}

八、案例三:往创建的表中插入数据

往water_bill中插入数据

1.主要步骤

  • 使用hbase的连接获取表对象
  • 构建rowkey、列簇名、列名、值
  • 构建Put对象(对应shell中的put命令)
  • 添加某列(列簇、列名、值)
  • 表对象执行put操作
  • 关闭表对象

2.创建方法,编写代码

image-20230405100251157

3.在main中调用插入数据的方法

image-20230405100326621

4.执行,查看结果

image-20230405100348320

5.作业:插入其他列的数据

在前面,我们只插入了3列数据,下面我们插入其他列的数据:

image-20230405102748477

image-20230405102728468

6.完整代码

package cn.edu.hgu.bigdata20;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * describe:实现Hbase的增删改查
 * author:王
 * date:2023/3/30
 */
public class HBaseCRUD {
    //定义admin对象
    public static Admin admin = null;
    // 定义connection对象
    public static Connection connection = null;

    // 主方法
    public static void main(String[] args) throws IOException {
        init();
        //创建表water_bill444
        // createTable("water_bill444", "info");
        // createTable("water_bill333", "info");
        //删除表
        //deleteTable("water_bill444");
        // 插入数据
        //insertData("water_bill333", "10000001", "info", "username", "zhangsan");//插入姓名
        //insertData("water_bill333", "10000001", "info", "sex", "男");//插入性别
        //insertData("water_bill333", "10000001", "info", "money", String.valueOf(150));//插入金额
        insertData("water_bill333", "10000001", "info", "payment_date", "2023-3-23");//插入缴费时间
        insertData("water_bill333", "10000001", "info", "last_payment_date", "2023-2-1");//插入最近缴费日期
        insertData("water_bill333", "10000001", "info", "table_lookup_date", "2023-3-23");//插入查表日期
        insertData("water_bill333", "10000001", "info", "address", "石家庄市裕华区万达小区1-1-101");//插入地址
        insertData("water_bill333", "10000001", "info", "representation_number", String.valueOf(308.1));//插入表示数(本次)
        insertData("water_bill333", "10000001", "info", "last_representation_number", String.valueOf(283.1));//插入表示数(上次)
        insertData("water_bill333", "10000001", "info", "dosage", String.valueOf(25));//插入用量(立方)
    }

    /**
     * 初始化admin
     *
     * @throws IOException
     */
    public static void init() throws IOException {
        //admin = getAdmin();
        // 1.创建hbase的配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.创建hbase的连接
        //通过工厂模式,根据配置来创建连接
        connection = ConnectionFactory.createConnection(configuration);
        // 3.创建admin对象
        admin = connection.getAdmin();
        // 4.返回创建的admin对象
        // return admin;
    }

    /**
     * 获取admin
     */
    public static Admin getAdmin() throws IOException {
        // 1.创建hbase的配置
        Configuration configuration = HBaseConfiguration.create();
        // 2.创建hbase的连接
        //通过工厂模式,根据配置来创建连接
        Connection connection = ConnectionFactory.createConnection(configuration);
        // 3.创建admin对象
        Admin admin = connection.getAdmin();
        // 4.返回创建的admin对象
        return admin;
    }


    /**
     * 创建表
     *
     * @param tableName
     * @param columnFamily
     * @return
     * @throws IOException
     */
    public static boolean createTable(String tableName, String columnFamily) throws IOException {
        //Admin admin = getAdmin();
        // 1.定义表名,判断表是否存在
        TableName table = TableName.valueOf(tableName);
        if (!admin.tableExists(table)) {
            // 2.表描述构建器
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(table);//构建器模式
            // 3.列簇描述构建器
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
            // 3.1 定义列簇描述构建器,建立列簇描述对象
            ColumnFamilyDescriptor columnFamilyDescriptor = columnFamilyDescriptorBuilder.build();
            // 4.表描述对象和列簇描述对象建立关系
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
            // 5.定义表描述对象
            TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
            // 6.创建表
            admin.createTable(tableDescriptor);
            return true;
        } else {
            return false;
        }

    }

    /**
     * 删除表
     *
     * @param tableName
     * @return
     * @throws IOException
     */
    public static boolean deleteTable(String tableName) throws IOException {
        // 通过静态类方法创建admin对象
        //Admin admin = GetAdmin.getAdmin();
        // 1.定义表名,判断表是否存在
        TableName table = TableName.valueOf(tableName);
        // 2.如果存在,禁用表
        if (admin.tableExists(table)) {
            //禁用表
            admin.disableTable(table);
            //3.删除表
            admin.deleteTable(table);
        } else {
            return false;
        }
        return true;
    }

    /**
     * @param tableName
     * @param rowkey
     * @param columnFamily
     * @param column
     * @param value
     * @return
     * @throws IOException
     * @describe 插入数据
     */
    public static boolean insertData(String tableName, String rowkey, String columnFamily, String column, String value) throws IOException {
        // 1.使用Hbase的连接获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        // 2.构建rowkey、列粗名、列名、值
        // 3.构建Put对象(对应shell中的Put命令)
        Put put = new Put(Bytes.toBytes(rowkey));
        // 4.添加某列(列簇名、列名、值)
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
        // 5.表对象实现put操作
        table.put(put);
        // 6.关闭表对象
        table.close();
        return true;
    }
}

九、案例四:获取数据

1.获取某一列的数据

1)获取某一列的数据

image-20230405103759708

2)在main中调用用并执行,查看结果

image-20230405104137881

image-20230405104152665

2.获取一行数据

image-20230405105554816

image-20230405105614039

image-20230405110139505

3.代码

public static void getOne(String tableName, String rowkey) throws IOException {
        // 1.使用Hbase的连接获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        // 2.构建Get对象(对应shell中的get命令)
        Get get = new Get(Bytes.toBytes(rowkey));
        // 3.表对象执行get命令得到Result
        Result result = table.get(get);
        // 4.获取一行数据
//        byte[] row = result.getRow();
//        for (byte b : row) {
//            System.out.println(Bytes.toBytes(b));
//        }
        List<Cell> cells = result.listCells();
        for (Cell cell : cells) {
            System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
            System.out.println("=>" + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
        }
        // 5.关闭表对象
        table.close();

十、案例五:删除数据

image-20230405110659161

执行并查看结果

image-20230405111627207

image-20230405111642355

image-20230405111657063

十一、案例六:导入大量的数据

1.需求

有一份10w条记录的抄表数据文件

image-20230405111819409

2.导入数据到HBase表中

在HBase中,有一个import的MapReduce方法,可以专门用来将数据导入HBase表中。

使用命令:

hbase org.apache.hadoop.hbase.mapreduce.Import 表名 hdfs数据文件路径

3.上传数据文件到hdfs上

新建文件夹:

image-20230405112456419

上传文件到hadoop集群:

image-20230405112757725

web ui查看

image-20230405112839552

4.创建表

image-20230405113126885

image-20230405113158809

5.启动yarn

image-20230405113238941

6.运行导入命令

hbase org.apache.hadoop.hbase.mapreduce.Import WATER_BILL /water_bill

image-20230405113631945

image-20230405113731866

执行成功:

image-20230405113806505

7.查看数据

scan "WATER_BILL",{FORMATTER=>'toString',LIMIT=>2}

image-20230405114013719

8.count计数

count "WATER_BILL"

image-20230405114243103

image-20230405114511344

9.mapreduce 计数

hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'WATER_BILL'

image-20230405114645587

image-20230405114658806

十二、案例七:查询2020年6月份所有的用户的用水量

1.需求分析

在HBase中使用scan+filter实现数据的过滤查询。2020年6月份其实就是从2020年6月1号到2020年6月30号的所有的超标数据中的用水量

实现步骤:

  1. 获取表
  2. 构建scan请求对象
  3. 构建两个过滤器
    • a) 构建两个日期范围过滤器(注意此处请使用RECORD_DATE——抄表日期比较
    • b) 构建过滤器列表
  4. 执行scan扫描请求
  5. 迭代打印result
  6. 迭代单元格列表
  7. 关闭ResultScanner(这玩意把转换成一个个的类似get的操作,注意要关闭释放资源)
  8. 关闭表

2.编写代码

image-20230410091641598

image-20230410091656783

/**
     * 查询数据
     *
     * @param tableName
     * @param family
     * @param column
     * @param startValue
     * @param endValue
     * @return
     * @throws IOException
     */
    public static boolean queryData(String tableName, String family, String column, String startValue, String endValue) throws IOException {
        // 1.使用Hbase的连接获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        // 2.创建Scan对象
        Scan scan = new Scan();
        // 3.创建两个过滤器
        // 3.1 创建开始日期过滤器
        SingleColumnValueFilter startDateFilter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column),
                CompareOperator.GREATER_OR_EQUAL, Bytes.toBytes(startValue));
        // 3.2 创建结束日期过滤器
        SingleColumnValueFilter endDateFilter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column),
                CompareOperator.LESS_OR_EQUAL, Bytes.toBytes(endValue));

        // 3.3 创建过滤器列表
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, startDateFilter, endDateFilter);

        // 4.构建扫描器
        scan.setFilter(filterList);
        // 5.执行扫描操作
        ResultScanner resultScanner = table.getScanner(scan);
        // 6.迭代打印result
        for (Result result : resultScanner) {
            // 打印rowkey
            System.out.println("rowkey=>" + Bytes.toString(result.getRow()));
            // 迭代打印单元格列表
            List<Cell> cells = result.listCells();
            for (Cell cell : cells) {
                // 打印列簇及列名
                System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
                // 打印值
                System.out.println("=>" + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
            }
        }

        // 7.关闭资源
        resultScanner.close();
        table.close();

        return true;
    }

3.在main中调用方法

image-20230410094847649

queryData("WATER_BILL", "C1", "RECORD_DATE", "2020-06-01", "2020-06-30");

4.执行,查看结果

image-20230410095039830

5.用量及金额乱码,需要对代码进行改进

解决数值型数据的显示乱码问题,在HBase中,如果是字符串数据,则可以正常显示,但是如果HBase存储的是int、double、float等数值型数据时,显示就会乱码,解决的方法就是判断是否是数值型数据,如果是则进行相应的转换

image-20230410095151918

String colName = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                System.out.print(colName);

                if (colName.equals("NUM_CURRENT")
                        || colName.equals("NUM_PREVIOUS")
                        || colName.equals("NUM_USAGE")
                        || colName.equals("TOTAL_MONEY")) {
                    System.out.println(" => " + Bytes.toDouble(cell.getValueArray(), cell.getValueOffset()));
                } else {
                    System.out.println(" => " + Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
                }

重新执行,查看结果

image-20230410095323137

十三、案例八:导出数据

Export Job

用法:

hbase org.apache.hdoop.hbase.mapreduce.Export 表名 hdfs路径

执行命令:

hbase org.apache.hadoop.hbase.mapreduce.Export WATER_BILL /output/water_bill

image-20230410095543038

image-20230410095557886

在web ui 上查看:

image-20230410095645983

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

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

相关文章

【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现

更新信息&#xff1a;2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 更新信息&#xff1a;2023-4-15 更新了代码 1 题目 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需…

Linux程序的内存

要研究程序的运行环境&#xff0c;首先要弄明白程序与内存的关系。程序与内存的关系&#xff0c;好比鱼和水一般密不可分。内存是承载程序运行的介质&#xff0c;也是程序进行各种运算和表达的场所。了解程序如何使用内存&#xff0c;对程序本身的理解&#xff0c;以及后续章节…

【CSS-Part3 样式显示模式、背景设置、三大特性 】

CSS-Part3 样式显示模式、背景设置、三大特性一 CSS元素显示模式&#xff1a;1.1块元素&#xff1a;1.2行内元素&#xff1a;1.3行内块元素&#xff1a;(同时具有行内元素和块元素的特点)元素显示模式总结&#xff1a;1.4元素显示模式转换&#xff1a;一种模式的元素需要另一模…

从Navicat 和 DBeaver中导出数据不要文本识别符号 “”

今天需要从MySQL和ClickHouse数据库中导出CSV数据文件&#xff0c;打开CSV数据文件后发现字段的数据带着""这种不需要的符号&#xff0c;研究了一下终于成功导出了不要文本识别符号“”的CSV文件 一、演示从DBeaver导出ClickHouse数据库的表文件 第一步&#xff0c…

SSH、OpenSSH、SSL、OpenSSL及CA

OpenSSL1. SSH、OpenSSH、SSL、OpenSSL关系及区别2. SSH介绍2.1 概念2.2 SSH的主要功能2.3 示例讲解2.4 ssh和sshd的区别3. OpenSSH介绍3.1 概念3.2 OpenSSH程序简介3.3 OpenSSH 包含的组件1. ssh2. scp3. sftp4. sshd5. ssh-keygen6. ssh-copy-id7. ssh-agent8. ssh-add9. ssh…

刘二大人《Pytorch深度学习实践》第九讲多分类问题

文章目录多分类问题损失函数课上代码transforms的使用方法view&#xff08;&#xff09;函数dim维度的理解为什么要使用item()多分类问题 把原来只有一个输出&#xff0c;加到10个 每个输出对应一个数字&#xff0c;这样可以得到每个数字对应的概率值&#xff0c;这里每个输出做…

Netty实战与调优

Netty实战与调优 聊天室业务介绍 代码参考 /*** 用户管理接口*/ public interface UserService {/*** 登录* param username 用户名* param password 密码* return 登录成功返回 true, 否则返回 false*/boolean login(String username, String password); }/*** 会话管理接口…

如何快速上手Vue框架?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 运行环境&#xff1a;Google浏览器 Vue框架版本&#xff1a;Vue.js v2.7.14 目录一. 框架是什么&#xff1f;二. 怎么写一个Vue程序&#xff08;以IDEA举例&#xff09;&#xff1f;三. 什么是声明式渲染?3.1 声明式3.2 渲染四…

docker安装oracle_11g -- 命还长时,自己搞的小玩具!!!

前言: 如果不是嫌命长, 建议不这么玩, 因为装到最后你会很崩溃, 感觉毫无意义, 就是个玩具, 哎~~~就是玩!!! 参考文档 1.https://blog.51cto.com/u_12946336/5722259 2.https://www.muzhuangnet.com/show/118178.html 3.https://blog.csdn.net/qq_42957435/article/details/1…

spring security+jwt实现认证和授权

最近正在研究前后端分离的开发模式&#xff0c;做做小项目练练手&#xff0c;正好用到了spring security的认证和授权&#xff0c;就总结一波。 首先&#xff0c;引入相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

支付系统设计:收银台设计一

文章目录前言1. 收银台前端页面1. 1 收银台的业务场景1. 2 同应用不同支付场景下的收银台2. 商户平台配置管理2.1 配置流程2.2 支付工具列表配置2.3 支付配置2.3 支付银行配置3. 系统处理流程3.1 下单流程3.1 拉起收银台流程总结前言 收银台即用户日常付款前选择支付方式的页面…

革新设计,小巧强大,水库保卫无忧!

水库安全运行事关广大人民群众生命财产安全&#xff0c;为规范水库管理&#xff0c;落实水库预报、预警、预演、预案措施&#xff0c;提升水库信息化管理水平&#xff0c;保障水库安全运行。水库大坝是重要的国民基础设施&#xff0c;承担着防洪抗旱&#xff0c;节流发电的重要…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

SGAT丨单基因分析工具SingleGeneAnalysisTool

Single Gene Analysis Tool 简介&#xff1a;SGAT是一个免费开源的单基因分析工具&#xff0c;基于Linux系统实现自动化批量处理&#xff0c;能够快速准确的完成单基因和表型的关联分析&#xff0c;只需要输入基因型和表型原始数据&#xff0c;即可计算出显著关联的SNP位点&…

学习大数据需要什么语言基础

Python易学&#xff0c;人人都可以掌握&#xff0c;如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言排名上升最快&#xff0c;能完成数据挖掘、机器学习、实时计算在内的各种大数…

测试名词介绍

测试名词介绍一&#xff1a;敏捷测试1. 定义&#xff1a;2. 敏捷测试的核心&#xff1a;3. 敏捷测试的8大原则和传统测试的区别二&#xff1a;测试名词介绍瀑布模型回归测试Alpha测试Beta测试性能测试白盒测试黑盒测试灰盒测试三&#xff1a;测试流程单元测试 (unit test)集成测…

Java RSA加解密算法学习

一、前言 1.1 问题思考 为什么需要加密 / 解密&#xff1f;信息泄露可能造成什么影响&#xff1f; 二、 基础回顾 2.1 加密技术 加密技术是最常用的安全保密手段&#xff0c;利用技术手段把重要的数据变为乱码&#xff08;加密&#xff09;传送&#xff0c;到达目的地后再…

nginx的前端部署方式

1. 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 由俄罗斯的程序设计师Igor Sysoev所开发&#xff0c;官方测试nginx能够支支撑5万并发链接&#xff0c; 并且cpu、内存等资源消耗却非常低&#xff0…

javascript 数组详解

1.数组是可变的 数组内元素可以是不同的类型&#xff1a; 字符串一旦创建就不可变&#xff0c;但数组是可变的&#xff0c;且操作起来十分随意&#xff0c;例如&#xff1a; 直接修改数组长度&#xff0c;若新赋予长度小于原数组长度&#xff0c;会直接舍弃多余元素: 若新赋予…

【AI绘画】Midjourney和Stable Diffusion教程

之前我向大家介绍了这两个AI绘画网站&#xff1a; Stable Diffusion介绍&#xff1a; https://mp.csdn.net/mp_blog/creation/editor/130059509 Midjourney介绍: https://mp.csdn.net/mp_blog/creation/editor/130003233 前言 这里是新星计划本周最后一篇&#xff0c;主要…