Java 操作 HBase 表结构详解

Java 操作 HBase 表结构详解

一、Admin 是干什么的?

在 Java API 中:

对象 作用
Admin 表、列族管理
Table 数据读写

DDL 用 Admin,DML 用 Table


二、建表前的设计思考

HBase 表设计与 MySQL 完全不同:

  • 没有列
  • 只有列族
  • 列族是 物理存储单位

列族数量越少越好(1~3 个)


三、Java 建表完整流程

1 获取 Admin

Admin admin = HBaseConnectionUtil
        .getConnection()
        .getAdmin();

2 判断表是否存在

TableName tableName = TableName.valueOf("student");

if (admin.tableExists(tableName)) {
    System.out.println("表已存在");
    return;
}

3 创建表描述器

TableDescriptorBuilder tableBuilder =
        TableDescriptorBuilder.newBuilder(tableName);

4 添加列族

ColumnFamilyDescriptor infoCF =
        ColumnFamilyDescriptorBuilder
                .newBuilder("info".getBytes())
                .build();

ColumnFamilyDescriptor scoreCF =
        ColumnFamilyDescriptorBuilder
                .newBuilder("score".getBytes())
                .build();

tableBuilder.setColumnFamily(infoCF);
tableBuilder.setColumnFamily(scoreCF);

5 创建表

admin.createTable(tableBuilder.build());
admin.close();

四、完整建表代码

public class HBaseDDL {

    public static void createTable() throws Exception {
        Admin admin = HBaseConnectionUtil.getConnection().getAdmin();
        TableName tableName = TableName.valueOf("student");

        if (admin.tableExists(tableName)) {
            System.out.println("表已存在");
            return;
        }

        TableDescriptorBuilder tableBuilder =
                TableDescriptorBuilder.newBuilder(tableName);

        tableBuilder.setColumnFamily(
                ColumnFamilyDescriptorBuilder
                        .newBuilder("info".getBytes()).build());

        tableBuilder.setColumnFamily(
                ColumnFamilyDescriptorBuilder
                        .newBuilder("score".getBytes()).build());

        admin.createTable(tableBuilder.build());
        admin.close();
    }
}

五、删除表的完整流程

为什么要 disable?

HBase 不允许直接删除正在使用的表


public static void dropTable() throws Exception {
    Admin admin = HBaseConnectionUtil.getConnection().getAdmin();
    TableName tableName = TableName.valueOf("student");

    if (admin.tableExists(tableName)) {
        admin.disableTable(tableName);
        admin.deleteTable(tableName);
    }

    admin.close();
}

posted @ 2025-10-20 02:19  元始天尊123  阅读(3)  评论(0)    收藏  举报