HBase第二章:API操作(二)

系列文章目录

HBase第一章:集群搭建
HBase第二章:API操作(一)
HBase第二章:API操作(二)



前言

上次博客我们记录了DDL的操作api,这次博客我们主要记录一下DML的操作api。


一、创建类

在这里插入图片描述

二、代码编写

1.源代码

HBaseDML.java

package com.atguigu;


import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class HBaseDML {
    //添加静态属性 connection 指向单例连接
    public static Connection connection=HBaseConnection.connection;

    /**
     * 插入数据
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param rowkey 主键
     * @param columFamily 列族名称
     * @param columnName 列名
     * @param value 值
     */
    public static void putCell(String namespace ,String tableName ,String rowkey ,String columFamily,String columnName ,String value) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.调用相关方法插入数据
        //2.1创建put对象
        Put put = new Put(Bytes.toBytes(rowkey));

        //2.2给put对象添加数据
        put.addColumn(Bytes.toBytes(columFamily),Bytes.toBytes(columnName),Bytes.toBytes(value));

        //2.3将对象写入对应的方法
        try {
            table.put(put);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //3.关闭table
        table.close();
    }

    /**
     * 读取数据 读取对应的一行中的某一列
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param rowkey 主键
     * @param columFamily 列族名称
     * @param columnName 列名
     */
    public static void getCells(String namespace ,String tableName ,String rowkey ,String columFamily,String columnName) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //2.创建get对象
        Get get = new Get(Bytes.toBytes(rowkey));

        //如果直接调用 get 方法读取数据 此时读一整行数据
        //如果想读取某一列的数据 需要添加对应的参数
        get.addColumn(Bytes.toBytes(columFamily),Bytes.toBytes(columnName));
        //设置读取数据的版本(默认最新版)
        get.readAllVersions();

        try {
            //读取数据 得到 result 对象
            Result result = table.get(get);

            //处理数据
            Cell[] cells = result.rawCells();

            //测试方法: 直接把读取的数据打印到控制台
            //如果是实际开发 需要再额外写方法 对应处理数据
            for (Cell cell : cells) {
                String value = new String(CellUtil.cloneValue(cell));
                System.out.println(value);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //3.关闭table
        table.close();
    }

    /**
     * 扫描数据
     * @param namespace 命名空间
     * @param tableName 表格名称
     * @param startRow 开始的row 包含的
     * @param stopRow 结束的row 不包含
     */
    public static void scanRows(String namespace ,String tableName ,String startRow,String stopRow) throws IOException {
        //1.获取table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        //创建scan对象
        Scan scan = new Scan();

        // 如果此时直接调用 会直接扫描整张表
        // 添加参数 来控制扫描的数据

        // 起始行(默认包含)
        scan.withStartRow(Bytes.toBytes(startRow));
        // 结束行(默认不包含)
        scan.withStopRow(Bytes.toBytes(stopRow));

        try {
            // 读取多行数据,获取scanner
            ResultScanner scanner = table.getScanner(scan);

            // result 来记录一行数据 cell 数组
            // ResultScanner 来记录多行数据 result 的数组
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();
                for (Cell cell : cells) {
                    System.out.print(new String(CellUtil.cloneRow(cell)) + "-" +
                            new String(CellUtil.cloneFamily(cell)) + "-" +
                            new String(CellUtil.cloneQualifier(cell)) + "-" +
                            new String(CellUtil.cloneValue(cell)) + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //3.关闭table
        table.close();
    }

    /**
     * 带过滤的扫描
     * @param namespace 命名空间
     * @param tableName 表格名称
     * @param startRow 开始row
     * @param stopRow 结束 row
     * @param columFamily 列族名称
     * @param columnName 列名
     * @param value value值
     */
    public static void filterScan(String namespace ,String tableName ,String startRow,String stopRow,String columFamily,String columnName ,String value) throws IOException {
        // 1. 获取 table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));
        // 2. 创建 scan 对象
        Scan scan = new Scan();

        // 如果此时直接调用 会直接扫描整张表
        // 添加参数 来控制扫描的数据

        // 起始行(默认包含)
        scan.withStartRow(Bytes.toBytes(startRow));
        // 结束行(默认不包含)
        scan.withStopRow(Bytes.toBytes(stopRow));

        // 可以添加多个过滤
        FilterList filterList = new FilterList();

        // 创建过滤器
        // (1) 结果只保留当前列的数据
        ColumnValueFilter columnValueFilter = new ColumnValueFilter(
                Bytes.toBytes(columFamily),
                Bytes.toBytes(columnName),
                CompareOperator.EQUAL,
                Bytes.toBytes(value)
        );


        // (2) 结果保留整行数据
        // 结果同时会保留没有当前列的数据
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                Bytes.toBytes(columFamily),
                Bytes.toBytes(columnName),
                CompareOperator.EQUAL,
                Bytes.toBytes(value)
        );

        // 本身可以添加多个过滤器
        filterList.addFilter(singleColumnValueFilter);

        // 添加过滤
        scan.setFilter(filterList);

        try {
            // 读取多行数据 获得 scanner
            ResultScanner scanner = table.getScanner(scan);
            // result 来记录一行数据 cell 数组
            // ResultScanner 来记录多行数据 result 的数组
            for (Result result : scanner) {
                Cell[] cells = result.rawCells();
                for (Cell cell : cells) {
                    System.out.print(new String(CellUtil.cloneRow(cell)) + "-" +
                            new String(CellUtil.cloneFamily(cell)) + "-" +
                            new String(CellUtil.cloneQualifier(cell)) + "-" +
                            new String(CellUtil.cloneValue(cell)) + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //3.关闭table
        table.close();
    }

    /**
     * 删除一行中的一列数据
     * @param namespace 命名空间
     * @param tableName 表格名称
     * @param rowkey 主键
     * @param columFamily 列族名称
     * @param columnName 列名
     */
    public static void deleteColum(String namespace ,String tableName,String rowkey,String columFamily,String columnName) throws IOException {
        // 1.获取 table
        Table table = connection.getTable(TableName.valueOf(namespace, tableName));

        // 2.创建 Delete 对象
        Delete delete = new Delete(Bytes.toBytes(rowkey));


        // 3.添加删除信息
        // 3.1 删除单个版本
        delete.addColumn(Bytes.toBytes(columFamily),Bytes.toBytes(columnName));
        // 3.2 删除所有版本
        delete.addColumns(Bytes.toBytes(columFamily),Bytes.toBytes(columnName));

        try {
            //4.删除数据
            table.delete(delete);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //5.关闭资源
        table.close();
    }


    public static void main(String[] args) throws IOException {
//        putCell("atguigu","bigdata","2021","info","name","zhangsan");
//        putCell("atguigu","bigdata","2021","name","age","20");
//        putCell("atguigu","bigdata","2021","name","name","wangwu");
//        putCell("atguigu","bigdata","2022","info","age","22");
//        putCell("atguigu","bigdata","2022","info","name","dahai");
//        putCell("atguigu","bigdata","2022","name","name","songsong");


//        getCells("atguigu","bigdata","2021","info","name");

//        scanRows("atguigu","bigdata","2021","2022");

//        filterScan("atguigu","bigdata","2021","2022","info","name","zhangsan");

//        deleteColum("atguigu","bigdata","2021","info","name");

        System.out.println("其它代码");

        HBaseConnection.closeConnection();
    }
}

2.api测试

我们先用上次写的DDL随便创建一个表,命名空间等参数可以自定义。

createTable("atguigu","bigdata","info","name");

describe 'atguigu:bigdata’查看信息。
在这里插入图片描述
scan 'atguigu:bigdata’查看详细信息

在这里插入图片描述

1.插入数据

随便插点

putCell("atguigu","bigdata","2021","info","name","zhangsan");
putCell("atguigu","bigdata","2021","name","age","20");
putCell("atguigu","bigdata","2021","name","name","wangwu");
putCell("atguigu","bigdata","2022","info","age","22");
putCell("atguigu","bigdata","2022","info","name","dahai");
putCell("atguigu","bigdata","2022","name","name","songsong");

在这里插入图片描述

2.数据查询

查询表中
rowkey=“2021”
columFamily=“info”
columnName=“name”

        getCells("atguigu","bigdata","2021","info","name");

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

3.过滤查询

查询rowkey=2021的数据

scanRows("atguigu","bigdata","2021","2022");

在这里插入图片描述

4.详细过滤

filterScan("atguigu","bigdata","2021","2022","info","name","zhangsan");

在这里插入图片描述
这里要解释一下这个查询结果,第一个就是我们要得结果,但是为什么会有后边两个结果呢。
我们给过滤查询传入了四个参数,我们只会对含有这四个参数的值进行过滤,如果不完全包含这个参数则直接保留。

5.删除数据

deleteColum("atguigu","bigdata","2021","info","name");

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


总结

hbase的学习还有一些进阶内容,但考虑到博主是初学,没有必要学习太深,所以hbase的内容就学习到这里。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sqoop 是一个用于在 Hadoop 生态系统中导入和导出数据的工具。在本关中,我们将学习如何使用 Sqoop 将数据从关系型数据库导入到 HBase 中。 首先,我们需要确保已经在 Hadoop 集群中安装了 Sqoop 和 HBase。然后,我们需要创建一个目标表来存储从关系型数据库中导入的数据。 在 HBase 中创建表: ``` create 'employees', 'personal', 'professional' ``` 现在,我们可以使用 Sqoop 将数据从关系型数据库中导入到 HBase 中。假设我们要从 MySQL 数据库中导入一个名为 employees 的表,该表包含以下列和数据: | id | name | age | salary | |----|------|-----|--------| | 1 | John | 25 | 50000 | | 2 | Mary | 30 | 60000 | | 3 | Jack | 40 | 70000 | 我们可以使用以下命令将该表导入到 HBase 中: ``` sqoop import --connect jdbc:mysql://localhost/employees --username root --password password --table employees --hbase-table employees --column-family personal --hbase-row-key id --hbase-create-table ``` 该命令将从 MySQL 数据库中选择所有列,并将它们插入到 HBase 表中。我们指定了 HBase 表的名称和列族名称,以及用于 HBase 行键的列。 如果 HBase 表不存在,Sqoop 将自动创建它。我们还指定了一个选项 hbase-create-table,以确保表已经存在,如果表不存在则会创建。如果不使用此选项,则需要手动创建 HBase 表。 我们可以使用以下命令查看导入的数据: ``` hbase shell scan 'employees' ``` 输出应如下所示: ``` ROW COLUMN+CELL 1 column=personal:age, timestamp=1576289403403, value=25 1 column=personal:name, timestamp=1576289403403, value=John 1 column=personal:salary, timestamp=1576289403403, value=50000 2 column=personal:age, timestamp=1576289403403, value=30 2 column=personal:name, timestamp=1576289403403, value=Mary 2 column=personal:salary, timestamp=1576289403403, value=60000 3 column=personal:age, timestamp=1576289403403, value=40 3 column=personal:name, timestamp=1576289403403, value=Jack 3 column=personal:salary, timestamp=1576289403403, value=70000 ``` 我们可以看到,导入的数据已经存储在 HBase 表中。现在,我们可以在 Hadoop 生态系统中使用这些数据进行分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值