HBASE API 操作

这篇具有很好参考价值的文章主要介绍了HBASE API 操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. IDEA 连接 HBASE

1、idea 创建一个 maven 项目

2、添加相关依赖(HBASE 客户端(最主要)、服务端),pom.xml

<dependencies>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>1.2.6</version>
    </dependency>

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

3、在 resources 中添加 core-site.xml、hbase-site.xml

4、修改本机的 hosts 文件(在C:\Windows\System32\drivers\etc下),添加集群的 IP 名称:

192.168.131.137 hadoop1
192.168.131.138 hadoop2
192.168.131.139 hadoop3

注意:此步骤不添加,有可能会导致 idea 执行不成功!

项目结构:

F:.
│  pom.xml
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─jun
│  │  │          └─test
│  │  │                  TestApi.java
│  │  │
│  │  └─resources
│  │          core-site.xml
│  │          hbase-site.xml
│  │
│  └─test
│      └─java
└─target
    │  test_one.jar
    │
    ├─classes
    │  │  core-site.xml
    │  │  hbase-site.xml
    │  │
    │  └─com
    │      └─jun
    │          └─test
    │                  TestApi.class

参考文章:在本地用idea连接虚拟机上的hbase集群的实现代码

2. DDL 表操作

DDL 与表操作有关,比如:

  • 判断表是否存在
  • 创建、删除、修改表
  • 创建命名空间

2.1 配置连接

package com.jun.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
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 TestApi {
    public static Connection connection = null;
    public static Admin admin = null;

    static {
        try {
            // 获取配置信息
            Configuration configuration = HBaseConfiguration.create();
            configuration.set("hbase.zookeeper.quorum", "hadoop1,hadoop2,hadoop3");

            // 创建连接对象
            connection = ConnectionFactory.createConnection(configuration);

            // 创建 admin 对象
            admin = connection.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 关闭连接
    public static void close() {
        if (admin != null) {
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (connection != null) {
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        // 判断表是否存在
//        System.out.println(isTableExists("t1"));

        // 创建表
//        createTable("t2", "info");

        // 将表创建到命名空间中
//        createTable("0808:t2", "info");

        // 删除表
//        deleteTable("t2");

        // 创建命名空间
//        createNameSpace("0808");

        // 关闭资源
        close();
    }
}

2.2 判断表是否存在

// 判断表是否存在
public static boolean isTableExists(String tableName) throws IOException {
    boolean exists = admin.tableExists(TableName.valueOf(tableName));
    return exists;
}

2.3 创建表

创建表包括:添加列族信息、还可以将表添加到命名空间,创建之前可以先检查该表是否存在:

// 创建表
public static void createTable(String tableName, String... cfs) throws IOException {
    // 判断列族信息
    if (cfs.length <= 0) {
        System.out.println("请设置列族信息!!!");
        return;
    }

    // 判断表是否存在
    if (isTableExists(tableName)) {
        System.out.println(tableName + " 表已存在!!!");
        return;
    }

    // 创建表描述器对象
    HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(tableName));

    // 循环添加列族
    for (String cf : cfs) {
        descriptor.addFamily(new HColumnDescriptor(cf));
    }

    // 创建表
    admin.createTable(descriptor);
    System.out.println("表 " + tableName + " 创建成功!!!");
}

2.4 删除表

// 删除表
public static void deleteTable(String tableName) throws IOException {
    if (isTableExists(tableName)) {
        admin.disableTable(TableName.valueOf(tableName));   // 先停用表,再删除
        admin.deleteTable(TableName.valueOf(tableName));
        System.out.println("表 " + tableName + " 删除成功!!!");
    } else {
        System.out.println("表 " + tableName + " 不存在!!!");
    }
}

2.5 创建命名空间

// 创建命名空间
public static void createNameSpace(String ns) {
    // 创建命名空间描述器
    NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(ns).build();

    // 创建命名空间
    try {
        admin.createNamespace(namespaceDescriptor);
        System.out.println(ns + "命名空间创建成功!!!");
    } catch (NamespaceExistException e) {
        System.out.println("命名空间 " + ns + " 已存在!!!");
    }
    catch (IOException e) {
        e.printStackTrace();
    }

}

可以在 hbase shell 中使用 list_namespace 查看命名空间:

hbase(main):012:0> list_namespace
NAMESPACE                                                                                 0808                                                                                     default                                                                                   hbase                                                                                                                                
3 row(s) in 0.0420 seconds
    
// t2 表在 0808 命名空间里
hbase(main):014:0> list
TABLE                                                                                     0808:t2                                                                                   t1                                                                                                                                   
2 row(s) in 0.0430 seconds

=> ["0808:t2", "t1"]

3. DML 表记录操作

DML主要是针对表的记录的操作,如插入、删除记录、查询记录等

3.1 插入数据

插入单条数据

 // 插入数据
public static void putData(String tableName, String rowKey, String cf, String cn, String value) throws IOException {
    // 获取表对象
    Table table = connection.getTable(TableName.valueOf(tableName));

    // 获取 Put 对象
    Put put = new Put(Bytes.toBytes(rowKey));

    // 给 put 对象赋值
    put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));

    // 插入数据
    table.put(put);

    System.out.println("数据插入成功!!!");

    // 关闭表连接
    table.close();
}

测试:

// 插入数据
putData("t2", "10001", "info", "name", "rose");

插入多条数据

使用集合:

public static byte[] getBytes(String value) {
    return Bytes.toBytes(value);
}

// 插入多条数据
public static void putManyData(String tableName, String cf, String cn, String value) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));

    // 定义一个集合
    List<Put> puts = new ArrayList<>();
    int row_key = 10001;

    for (int i = 1; i <= 5; i++) {
        row_key = row_key + i;
        Put put = new Put(getBytes(String.valueOf(row_key)));
        put.addColumn(getBytes(cf), getBytes(cn + i), getBytes(value + i));
        puts.add(put);
    }
    table.put(puts);
    System.out.println("成功插入多行数据!");
    table.close();
}

测试:

// 插入多条数据
putManyData("t2", "info", "alias", "jun");

// scan t2
hbase(main):005:0> scan 't2'
ROW                            COLUMN+CELL                                                                          
10001                         column=info:name, timestamp=1628369721705, value=rose     10002                         column=info:alias1, timestamp=1628383262854, value=jun1     10004                         column=info:alias2, timestamp=1628383262854, value=jun2     10007                         column=info:alias3, timestamp=1628383262854, value=jun3     10011                         column=info:alias4, timestamp=1628383262854, value=jun4     10016                         column=info:alias5, timestamp=1628383262854, value=jun5                              
6 row(s) in 0.0860 seconds

3.2 get 数据

获取某行数据

// get 单条数据
public static void getData(String tableName, String rowKey) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));

    Get get = new Get((Bytes.toBytes(rowKey)));

    // 获取最大版本数
    System.out.println(get.getMaxVersions());
    //        System.out.println(get.setTimeStamp());

    // 获取整行数据
    Result result = table.get(get);
    for (Cell cell : result.rawCells()) {
        System.out.println("行键: " + Bytes.toString(result.getRow()));
        System.out.println("列族: " + Bytes.toString(CellUtil.cloneFamily(cell)));
        System.out.println("列: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
        System.out.println("值: " + Bytes.toString(CellUtil.cloneValue(cell)));
        System.out.println("时间戳: " + cell.getTimestamp());

    }
    table.close();
}

测试数据:

// 获取数据
getData("t2", "10001");

1
行键: 10001
列族: info
列: name
值: rose
时间戳: 1628369721705

指定列族、列名

// 指定列族
get.addFamily(Bytes.toBytes(cf));

// 指定列名
get.addColumn(Bytes.toBytes(cn));

3.3 scan 数据

// scan 所有数据
public static void scanData(String tableName) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));

    Scan scan = new Scan();
    ResultScanner resultScanner = table.getScanner(scan);
    for (Result result : resultScanner) {
        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            System.out.println("行键: " + Bytes.toString(result.getRow()));
            System.out.println("列族: " + Bytes.toString(CellUtil.cloneFamily(cell)));
            System.out.println("列: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
            System.out.println("值: " + Bytes.toString(CellUtil.cloneValue(cell)));
            System.out.println("时间戳: " + cell.getTimestamp());
            System.out.println("-------------------------------------------\n\n");
        }
    }
	table.close();
}

测试数据:

// 扫描所有数据
scanData("t2");

行键: 10001
列族: info
列: name
值: rose
时间戳: 1628369721705
-------------------------------------------


行键: 10002
列族: info
列: alias1
值: jun1
时间戳: 1628383262854
-------------------------------------------


行键: 10004
列族: info
列: alias2
值: jun2
时间戳: 1628383262854
-------------------------------------------


行键: 10007
列族: info
列: alias3
值: jun3
时间戳: 1628383262854
-------------------------------------------


行键: 10011
列族: info
列: alias4
值: jun4
时间戳: 1628383262854
-------------------------------------------


行键: 10016
列族: info
列: alias5
值: jun5
时间戳: 1628383262854
-------------------------------------------

建议

使用 scan 扫描全表时,最好设置 startRow、endRow,亦或者是带过滤条件的翻页,而非全表扫描:

// 设置 startRow
Scan(Bytes.toBytes("startRow"))
  
// 设置 startRow、endRow
Scan(Bytes.toBytes("startRow"), Bytes.toBytes("endRow"))
    
// 实际工作中一般不知道 endRow,而是带过滤条件的翻页
Scan(Bytes.toBytes("startRow"), Filter filter)
    
ResultScanner resultScanner = table.getScanner(scan);

3.4 删除数据

删除单行数据

// 删除单行数据
public static void deleteData(String tableName, String rowKey) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));

    // 获取 delete 对象
    Delete delete = new Delete(Bytes.toBytes(rowKey));

    // 删除指定的列族、列名
    //        delete.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));

    table.delete(delete);
    System.out.println(rowKey + " 删除成功!!!");
    table.close();
}

测试:

// 删除单行数据
deleteData("t2", "10001");

hbase(main):007:0> scan 't2'
ROW                                COLUMN+CELL                                                                                       
 10002                             column=info:alias1, timestamp=1628383262854, value=jun1                                           
 10004                             column=info:alias2, timestamp=1628383262854, value=jun2                                           
 10007                             column=info:alias3, timestamp=1628383262854, value=jun3                                           
 10011                             column=info:alias4, timestamp=1628383262854, value=jun4                                           
 10016                             column=info:alias5, timestamp=1628383262854, value=jun5                                           
5 row(s) in 0.1290 seconds

删除多行数据

// 删除多行数据
public static void deleteManyData(String tableName, String... rows) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));

    List<Delete> deletes = new ArrayList<>();

    for (String row : rows) {
        Delete delete = new Delete(Bytes.toBytes(row));
        deletes.add(delete);
    }

    table.delete(deletes);
    System.out.println("删除成功!!!");
    table.close();
}

测试:文章来源地址https://www.toymoban.com/news/detail-415519.html

// 删除多行数据
deleteManyData("t2", "10002", "10007");

hbase(main):008:0> scan 't2'
ROW                                COLUMN+CELL                                                                                       
 10004                             column=info:alias2, timestamp=1628383262854, value=jun2                                           
 10011                             column=info:alias4, timestamp=1628383262854, value=jun4                                           
 10016                             column=info:alias5, timestamp=1628383262854, value=jun5                                           
3 row(s) in 0.1140 seconds

4. 参考文章

  • 第6章HBase API操作
  • HBase Java API 批量操作
  • hbase实战之javaAPI插入数据
  • HBase- ddl(表操作)、dml(记录操作)的基本语法操作
  • HBase学习之路 (六)过滤器

到了这里,关于HBASE API 操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IDEA使用Maven快速创建一个Webapp项目(太细)

    环境:IDEA 2022.3.2 Maven项目的配置文件路径必须先设置好,否则一些依赖就不能成功引用(如果不是使用默认的本地仓库地址,而是新建的一个本地仓库地址),里面指向的是本地仓库的地址。(配置本地仓库和maven文件后期出 操作路径: Setting——搜索Maven——点击Maven——设

    2024年02月08日
    浏览(55)
  • 用Eclipse创建一个JavaWeb项目,把资源添加到Tomcat服务器,并运行jsp文件详细过程(附图片)

    目录 前言 一、Eclipse下载安装 二、创建 1.创建web项目 2.创建jsp文件  三.设置Tomcat 四.解决问题  五、添加资源到tomcat服务器   六.运行 总结 使用Eclipse创建web项目时,务必先下载安装好JDK和Tomcat。 1、Eclipse J2EE: https://www.eclipse.org/downloads/  2、选择Eclipse IDE for Enterprise Java an

    2024年02月13日
    浏览(49)
  • 【Hbase】hbase的java api操作(3)

    目录 这篇文章的源码比较多,需要的私信我 需求与数据集 准备工作 下载安装maven 下载安装idea 配置国内的maven镜像库 创建一个maven工程 修改pom文件,导入相关的依赖 复制Hadoop的配置文件core-site.xml和HBase的配置文件hbase-site.xml到resources目录中 创建包结构 创建hbase连接类及管理

    2023年04月12日
    浏览(37)
  • 【Visual Studio 新手入门指导】包括项目创建、常用快捷键、美化、项目启动、添加文件等多种基础操作,图文详细,准确无误

    本文来自于作者在Visual Studio的使用过程中自己积累经验的总结,主要介绍一些比较实用的技巧,适合新手入门使用。 内容追求细致、有用、基础。 VS的每次运行的是一个一个的项目 (如果有多个项目,则每次执行选定启动项目,后文有所介绍),但是不同项目在一起构成一

    2024年02月08日
    浏览(59)
  • HBASE API 操作

    1、 idea 创建一个 maven 项目 2、添加相关依赖( HBASE 客户端(最主要)、服务端), pom.xml : 3、在 resources 中添加 core-site.xml、hbase-site.xml 4、修改本机的 hosts 文件(在 C:WindowsSystem32driversetc 下),添加集群的 IP 名称: 注意:此步骤不添加,有可能会导致 idea 执行不成功!

    2023年04月16日
    浏览(33)
  • Java(一):创建 Spring Boot 项目并实现连接操作MySQL数据库

    MySQL 命令 Maven 相关地址 下载地址: https://maven.apache.org/ maven配置方法地址: https://developer.aliyun.com/mvn/guide 仓库搜索地址: https://mvnrepository.com/ https://repo.maven.apache.org/ maven 本地配置 conf/settings.xml 下载 idea 并配置本地环境 maven Maven 构建 生命周期 Maven 的构建 生命周期 包括 三

    2024年02月07日
    浏览(70)
  • HBase 开发:使用Java操作HBase 第1关:创建表

    为了完成本关任务,你需要掌握:1.如何使用 Java 连接 HBase 数据库,2.如何使用 Java 代码在 HBase 中创建表。 如何使用Java连接HBase数据库 Java 连接 HBase 需要两个类: HBaseConfiguration ConnectionFactory HBaseConfiguration 要连接 HBase 我们首先需要创建 Configuration 对象,这个对象我们需要通

    2024年01月22日
    浏览(36)
  • HBase Java API 开发:批量操作 第2关:批量删除数据

    删除单行数据 删除一行数据很简单,我们来看个示例: 这段代码就可以删除行键为 row1 的行。 删除多行数据 如何删除多行数据呢? 相信你已经猜到了,既然 get() 方法有重载方法,那应该 delete() 方法也有,确实: 这样就可以删除多行数据啦。 编程要求 还等啥,亲自试一试

    2024年02月05日
    浏览(56)
  • 在HBase中执行查询操作通常使用HBase Shell或编程语言API(如Java或Python)来执行

    在HBase中执行查询操作通常使用HBase Shell或编程语言API(如Java或Python)来执行。以下是使用HBase Shell进行查询的一些示例: 单行查询:获取指定行键的数据。 扫描表:按行范围获取表中的多个行的数据。 过滤器查询:使用过滤器指定查询条件来获取数据。 列族查询:获取指

    2024年01月21日
    浏览(47)
  • idea连接虚拟机的Hbase(附基本的创建表与查看表是否存在代码)

    先看一下总体概况 1,首先快速创建一个Maven项目提供依赖支持 如果不用模板,我是不能采用aliyun镜像下载相关依赖的,可能是我自己默认配置有问题 改变 Maven仓库为提前下载的仓库(具体配置可以自行搜索, 主要是改变setting配置与新建maven仓库) 可以看到相关配置已经自动通过阿

    2023年04月21日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包