数据库模式设计

最近更新时间:2025-12-24 12:03:43

我的收藏

创建表

表是数据存储的基本单位。创建表时需要指定表名、列族以及行键。
通过 HBase API 语句创建表。
package com.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;


public class HBaseCreateTableDemo {
public static void main(String[] args) throws Exception {
System.out.println("======================================================================");
System.out.println("HBase Create Table Demo Start");
System.out.println("======================================================================");
Configuration config = HBaseConfiguration.create();
config.setBoolean("hbase.defaults.for.version.skip", Boolean.TRUE);
config.set("hbase.client.tdsql.quorum", "10.10.10.10:6752");
config.setBoolean("hbase.tdsql.hash.partition", Boolean.TRUE);
config.set("mysql.native.username", "test");
config.set("mysql.native.password", "test123");
// 定义表名和列族
final TableName tableName = TableName.valueOf("demo_table");
final byte[] INFO_CF = Bytes.toBytes("info");
final byte[] DETAIL_CF = Bytes.toBytes("detail");
try (Connection connection = ConnectionFactory.createConnection(config)) {
try (Admin admin = connection.getAdmin()) {
// 检查表是否已存在
if (admin.tableExists(tableName)) {
System.out.println("Table " + tableName.getNameAsString() + " already exists");
System.out.println("Skipping table creation...");
} else {
// 创建表描述符
// info列族: min_versions=1, max_versions=2
// detail列族: min_versions=2, max_versions=4
System.out.println("\\n=== Creating table: " + tableName.getNameAsString() + " ===");
TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(tableName);
tdb.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(INFO_CF)
.setMinVersions(1)
.setMaxVersions(2)
.build());
tdb.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(DETAIL_CF)
.setMinVersions(2)
.setMaxVersions(4)
.build());
// 创建表
admin.createTable(tdb.build());
System.out.println("Table created successfully: " + tableName.getNameAsString());
}
}
}
System.out.println("\\n======================================================================");
System.out.println("HBase Create Table Demo Completed");
System.out.println("======================================================================");
}
}
参数说明:
参数名称
类型
必需
说明
示例值
hbase.client.tdsql.quorum
String
TDSQL Boundless 服务的 RPC 地址和端口。
10.10.10.10:6752
hbase.tdsql.hash.partition
Boolean
启用 HBase 兼容模式,必须设置为true
Boolean.TRUE
mysql.native.username
String
用户账号。
user
mysql.native.password
String
账号密码。
passwd

管理列族(ColumnFamily)

对已存在的表进行列族结构调整,包括添加新列族和修改现有列族配置。
package com.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;

/**
* HBase 修改列族示例程序
* 演示如何修改表的列族属性
*/
public class HBaseModifyColumnFamilyDemo {
public static void main(String[] args) throws Exception {
System.out.println("======================================================================");
System.out.println("HBase Modify Column Family Demo Start");
System.out.println("======================================================================");
Configuration config = HBaseConfiguration.create();
config.set("hbase.client.tdsql.quorum", "10.10.10.10:6752");
config.setBoolean("hbase.tdsql.hash.partition", Boolean.TRUE);
config.set("mysql.native.username", "test");
config.set("mysql.native.password", "test123");
// 定义表名和列族
final TableName tableName = TableName.valueOf("demo_table");
final byte[] FAMILY = Bytes.toBytes("info");
final byte[] otherFamily = Bytes.toBytes("detail");
try (Connection connection = ConnectionFactory.createConnection(config)) {
try (Admin admin = connection.getAdmin()) {
// 检查表是否存在
if (!admin.tableExists(tableName)) {
System.out.println("✗ Table " + tableName.getNameAsString() + " does not exist");
System.out.println("Please create the table first.");
return;
}
System.out.println("Table " + tableName.getNameAsString() + " exists");
// 获取当前表的描述符
System.out.println("\\n=== Getting current table descriptor ===");
TableDescriptor current = admin.getDescriptor(tableName);
// 打印当前列族配置
System.out.println("\\nCurrent Column Family Configuration:");
for (ColumnFamilyDescriptor cf : current.getColumnFamilies()) {
System.out.println(" CF: " + Bytes.toString(cf.getName()));
System.out.println(" MinVersions: " + cf.getMinVersions());
System.out.println(" MaxVersions: " + cf.getMaxVersions());
System.out.println(" TimeToLive: " + cf.getTimeToLive());
}
// 修改第一个 CF 的 MaxVersions
System.out.println("\\n=== Modifying Column Family: " + Bytes.toString(FAMILY) + " ===");
ColumnFamilyDescriptor updatedPrimary =
ColumnFamilyDescriptorBuilder.newBuilder(current.getColumnFamily(FAMILY))
.setMaxVersions(current.getColumnFamily(FAMILY).getMaxVersions() + 3)
.build();
System.out.println(" Old MaxVersions: " + current.getColumnFamily(FAMILY).getMaxVersions());
System.out.println(" New MaxVersions: " + updatedPrimary.getMaxVersions());
// 修改第二个 CF 的 MinVersions 和 TimeToLive
System.out.println("\\n=== Modifying Column Family: " + Bytes.toString(otherFamily) + " ===");
ColumnFamilyDescriptor updatedSecondary =
ColumnFamilyDescriptorBuilder.newBuilder(current.getColumnFamily(otherFamily))
.setMinVersions(current.getColumnFamily(otherFamily).getMinVersions() + 1)
.setTimeToLive(60)
.build();
System.out.println(" Old MinVersions: " + current.getColumnFamily(otherFamily).getMinVersions());
System.out.println(" New MinVersions: " + updatedSecondary.getMinVersions());
System.out.println(" Old TimeToLive: " + current.getColumnFamily(otherFamily).getTimeToLive());
System.out.println(" New TimeToLive: " + updatedSecondary.getTimeToLive());
// 使用 modifyColumnFamily 应用修改
System.out.println("\\n=== Applying modifications ===");
TableDescriptor updated = TableDescriptorBuilder.newBuilder(current)
.modifyColumnFamily(updatedPrimary)
.modifyColumnFamily(updatedSecondary)
.build();
admin.modifyTable(updated);
System.out.println("Table modified successfully");
// 验证修改结果
System.out.println("\\n=== Verifying modifications ===");
TableDescriptor modified = admin.getDescriptor(tableName);
System.out.println("\\nModified Column Family Configuration:");
for (ColumnFamilyDescriptor cf : modified.getColumnFamilies()) {
System.out.println(" CF: " + Bytes.toString(cf.getName()));
System.out.println(" MinVersions: " + cf.getMinVersions());
System.out.println(" MaxVersions: " + cf.getMaxVersions());
System.out.println(" TimeToLive: " + cf.getTimeToLive());
}
}
}
System.out.println("\\n======================================================================");
System.out.println("HBase Modify Column Family Demo Completed");
System.out.println("======================================================================");
}
}