1.建表 表名 列族
* 1)单列族
* 2)多列族
* 3)预分region表
* 4)在DOIT名称空间下建表 DOIT:tb_stu
2 禁用表 是否禁用 启用 是否启用
3 表是否存在
4 删除表
5 修改表结构 列族
* 5.1 modifyColumnFamily只能修改已经存在的列族
* 5.2 admin.modifyTable(tableDescriptor); 参数是一个tableDescriptor描述对象 添加列族 删除列族 覆盖列族
1.建立表格
1)单列族
private static void createTableOneCf(Admin admin) throws IOException {
//表的构造器
TableDescriptorBuilder tb_tableData1 = TableDescriptorBuilder.newBuilder(TableName.valueOf("tb_tableData1"));
//列族构造器
ColumnFamilyDescriptorBuilder familyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder("cf1".getBytes());
//设置属性 用列族构造器直接设置属性
familyDescriptorBuilder.setMaxVersions(5);
familyDescriptorBuilder.setTimeToLive(240);
//设置了属性之后可以构造列族对象 用构造器调用build()方法
ColumnFamilyDescriptor columnFamilyDescriptor1 = familyDescriptorBuilder.build();
//将列族对象添加到表中 用表的构造器set列族对象
tb_tableData1.setColumnFamily(columnFamilyDescriptor1);
//构造表对象 表的构造器调用build()方法
TableDescriptor tableDescriptor1 = tb_tableData1.build();
admin.createTable(tableDescriptor1);
}
在java实现hbase的shell命令中,大部分都是上一级先创建一个构造器(newbuilder),然后再创建下一级构造器(newbuilder),到最后一集时候,再设置属性,然后一层一层往上.build();大部分的构造器命令都是"名称+DescriptorBuilder"(例如表的构造器TableDescriptorBuilder)
2)多列族
private static void createTableMoreCf(Admin admin) throws IOException {
//表构造器
TableDescriptorBuilder tb_tableData2 = TableDescriptorBuilder.newBuilder(TableName.valueOf("tb_TableData2"));
//列族构造器
ColumnFamilyDescriptorBuilder familyDescriptorBuilder1 = ColumnFamilyDescriptorBuilder.newBuilder("cf1".getBytes());
ColumnFamilyDescriptorBuilder familyDescriptorBuilder2 = ColumnFamilyDescriptorBuilder.newBuilder("cf2".getBytes());
//分别给两个列族设置属性
familyDescriptorBuilder1.setTimeToLive(240);
familyDescriptorBuilder1.setMaxVersions(5);
familyDescriptorBuilder2.setMaxVersions(5);
familyDescriptorBuilder2.setTimeToLive(240);
//创建两个列族对象
ColumnFamilyDescriptor columnFamilyDescriptor1 = familyDescriptorBuilder1.build();
ColumnFamilyDescriptor columnFamilyDescriptor2 = familyDescriptorBuilder2.build();
//将列族添加到list中
ArrayList<ColumnFamilyDescriptor> columnFamilyDescriptors = new ArrayList<>();
columnFamilyDescriptors.add(columnFamilyDescriptor1);
columnFamilyDescriptors.add(columnFamilyDescriptor2);
//将列族list设置到表中
tb_tableData2.setColumnFamilies(columnFamilyDescriptors);
//创建表对象
TableDescriptor tableDescriptor = tb_tableData2.build();
//建表
admin.createTable(tableDescriptor);
}
创建多列族的方法中,创建一个list接收ColumnFamilyDescriptor(列族对象),表能够设置列族的list
3)预分region表
private static void createTablePreRegion(Admin admin) throws IOException {
//表的构造器
TableDescriptorBuilder tb_preRegion = TableDescriptorBuilder.newBuilder(TableName.valueOf("tb_preRegion"));
//列族的构造器和创建列族对象
ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder("cf1".getBytes()).build();
//给表设置属性
tb_preRegion.setColumnFamily(columnFamilyDescriptor);
//创建表
TableDescriptor tableDescriptor = tb_preRegion.build();
//创建节点二维数组
byte[][] keys = {"rk026".getBytes(), "rk051".getBytes()};
//调用的是参数为 表对象,节点二维数组 的建表方法
admin.createTable(tableDescriptor,keys);
}
4)在DOIT名称空间下建表 DOIT:tb_stu
设置表名的时候直接设置TableName.valueof("DOIT:tb_stu"),就OK
代码不敲了,耶!
2 禁用表 是否禁用 启用 是否启用
private static void DropTable(Admin admin) throws IOException {
TableName tb_drop = TableName.valueOf("tb_drop");
if(admin.tableExists(tb_drop)){//如果表存在
if(admin.isTableDisabled(tb_drop)){
System.out.println("这个禁用了,我给你删了啊");
admin.deleteTable(tb_drop);
}else{
System.out.println("这个没被禁用,我给你禁了啊,然后就删了");
admin.disableTable(tb_drop);
admin.deleteTable(tb_drop);
}
}else{
System.out.println("神经病吧,就没有这个表");
}
}