HBase Java API 之 TableDescriptorBuilder,ColumnFamilyDescriptorBuilder

HBase 2.0.5 Jave API 中使用HTableDescriptor与HColumnDescriptor时提示不推荐使用了,并且在3.0.0版本将删除,而是使用TableDescriptorBuilder和ColumnFamilyDescriptorBuilder

不推荐使用的提示如下:

Deprecated. As of release 2.0.0, this will be removed in HBase 3.0.0. Use TableDescriptorBuilder to build HTableDescriptor.

Deprecated.  As of release 2.0.0, this will be removed in HBase 3.0.0 (HBASE-18433). Use ColumnFamilyDescriptorBuilder.of(String).

现将对TableDescriptorBuilder和ColumnFamilyDescriptorBuilder的研究记录如下。请多多指教!!

package snihytn.test.hbase205;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseTest2 {

    private static Configuration cfg = HBaseConfiguration.create();
    private static Admin admin;
    private static TableDescriptor tableDescriptor;
    private static Connection connection;

    // 列出数据库中所有表
    public static void listTables() throws IOException {
        // 创建数据库链接
        connection = ConnectionFactory.createConnection(cfg);
        // Admin用于管理HBase数据库的表信息
        admin = connection.getAdmin();
        System.out.println("====================== all user tables =======================");
        for (TableName tn : admin.listTableNames())
            System.out.println(tn);
        connection.close();// 关闭连接
        System.out.println("==============================================================\n");
    }

    /**
     * 删除表,若表存在则删除
     * 
     * @param tableName
     * @throws IOException
     */
    public static void deleteTable(String tableName) throws IOException {
        // 创建数据库链接
        connection = ConnectionFactory.createConnection(cfg);
        // Admin用于管理HBase数据库的表信息
        admin = connection.getAdmin();
        // TableName:以POJO对象来封装表的名字
        TableName tn = TableName.valueOf(tableName);

        // 如果表存在则删除(表中没有重要数据,用于测试时可以删除,生产中要慎用)
        if (admin.tableExists(tn)) {
            admin.disableTable(tn);
            admin.deleteTable(tn);
            System.out.println("============= delete " + tableName + " table success ================\n");
        } else {
            System.out.println("=========== the " + tableName + " table does not exist ==============\n");
        }
        // 关闭连接,释放资源
        connection.close();
    }

    /**
     * 创建表,当需要创建的表存在时,删除后再创建,这只适合于测试使用,生产上需慎用
     * 
     * @param tableName
     * @param familyNames
     * @throws IOException
     */
    public static void createTable(String tableName, String... familyNames) throws IOException {
        connection = ConnectionFactory.createConnection(cfg);
        admin = connection.getAdmin();
        TableName tn = TableName.valueOf(tableName);

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

        // 创建集合用于存放ColumnFamilyDescriptor对象
        List<ColumnFamilyDescriptor> families = new ArrayList<>();

        // 将每个familyName对应的ColumnFamilyDescriptor对象添加到families集合中保存
        for (String familyName : familyNames)
            families.add(ColumnFamilyDescriptorBuilder.newBuilder(familyName.getBytes()).build());

        // 构建TableDescriptor对象,以保存tableName与familyNames
        tableDescriptor = TableDescriptorBuilder.newBuilder(tn).setColumnFamilies(families).build();

        // 有了表描述器便可以创建表了
        admin.createTable(tableDescriptor);

        connection.close();
        System.out.println("=============== create " + tableName + " table success ===============\n");
    }

    /**
     * 修改表-增加列族(一次增加一个列族)
     * 
     * @param tableName
     * @param familyName
     * @throws IOException
     */
    public static void addColumnFamily(String tableName, String familyName) throws IOException {
        connection = ConnectionFactory.createConnection(cfg);
        admin = connection.getAdmin();
        TableName tn = TableName.valueOf(tableName);

        // 通过新增的familyName来构建ColumnFamilyDescriptor对象
        ColumnFamilyDescriptor columnFamily = ColumnFamilyDescriptorBuilder.newBuilder(familyName.getBytes()).build();

        admin.addColumnFamily(tn, columnFamily);
        connection.close();

        System.out.println("=============== add " + familyName + " columnFamily success ===============\n");
    }

    /**
     * 修改表-删除列族(一次删除一个列族)
     * 
     * @param tableName
     * @param familyName
     * @throws IOException
     */
    public static void removeColumnFamily(String tableName, String familyName) throws IOException {
        connection = ConnectionFactory.createConnection(cfg);
        admin = connection.getAdmin();
        TableName tn = TableName.valueOf(tableName);

        admin.deleteColumnFamily(tn, Bytes.toBytes(familyName));
        connection.close();
        System.out.println("=============== remove " + familyName + " columnName success ===============\n");
    }

    /**
     * 查看表结构
     * 
     * @param tableName
     * @throws IOException
     */
    public static void describeTable(String tableName) throws IOException {
        connection = ConnectionFactory.createConnection(cfg);
        admin = connection.getAdmin();
        TableName tn = TableName.valueOf(tableName);
        
        // 通过表名获取ColumnFamilyDescriptors,注意返回的是数组
        ColumnFamilyDescriptor[] families = admin.getDescriptor(tn).getColumnFamilies();

        System.out.println("===================== decribe " + tableName + " =====================");
        
        for (ColumnFamilyDescriptor family : families) {
            System.out.println(family.getNameAsString());
//            System.out.println(family.getBlocksize());
//            System.out.println(family.getConfigurationValue(key));
//            System.out.println(family.getMaxVersions());
//            System.out.println(family.getEncryptionType());
//            System.out.println(family.getTimeToLive());
//            System.out.println(family.getDFSReplication() + "\n");
        }
        connection.close();
        System.out.println("==============================================================\n");
    }

    public static void main(String[] args) throws IOException {

//        listTables();
//        deleteTable("ns1:scores");
//        createTable("ns1:scores", "grade", "course");// 创建表并指定2个列族
        describeTable("ns1:scores");
//        addColumnFamily("ns1:scores", "hobby");// 添加1个列族
//        describeTable("ns1:scores");
//        removeColumnFamily("ns1:scores", "grade");// 删除1个列族
//        describeTable("ns1:scores");
//        listTables();
    }
}

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值