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();
}
}