使用以下代码可以按照存在的表结构复制出新的表
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.client.coprocessor.AggregationClient;
import org.apache.hadoop.hbase.client.coprocessor.LongColumnInterpreter;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException, DeserializationException {
//存在的表的集群配置
Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.property.clientPort", "2181");
config.set("hbase.zookeeper.quorum", "h1,h2,h3");
Connection connection = ConnectionFactory.createConnection(config);
//需要新建表的集群配置
Configuration config1 = HBaseConfiguration.create();
config1.set("hbase.zookeeper.property.clientPort", "2181");
config1.set("hbase.zookeeper.quorum", "h1,h2,h3");
Connection connection1 = ConnectionFactory.createConnection(config1);
Admin admin1 = connection1.getAdmin();
Table table = connection.getTable(TableName.valueOf("hbase:meta"));
//粒度 2表示 2个rowkey 合并成一个
int acc = 2;
//源表名
String tableName = "库名:source_tableName";
//新表名
String newTableName = "库名:new_tableName";
Admin admin = connection.getAdmin();
TableDescriptor desc = admin.getDescriptor(TableName.valueOf(tableName));
TableDescriptor targetDesc = TableDescriptorBuilder.newBuilder(TableName.valueOf(newTableName)).setColumnFamilies(Arrays.asList(desc.getColumnFamilies())).build();
Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes(tableName));
scan.withStopRow(Bytes.toBytes(tableName + "_"));
ResultScanner scanner = table.getScanner(scan);
System.out.println("...");
List<byte[]> bs = new ArrayList<>();
int i = 0;
for (Result result : scanner) {
try {
if (result.getRow().length > tableName.getBytes(StandardCharsets.UTF_8).length) {
byte[] bt = Bytes.copy(result.getRow(), tableName.getBytes(StandardCharsets.UTF_8).length + 1, result.getRow().length - tableName.getBytes(StandardCharsets.UTF_8).length - 49);
if (bt.length > 0 && i % acc == 0) bs.add(bt);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
i++;
}
for (int i1 = 0; i1 < bs.size(); i1++) {
for (int i2 = i1+1; i2 < bs.size(); i2++) {
if(Bytes.toString(bs.get(i1)).equals(Bytes.toString(bs.get(i2)))){
System.out.println(Bytes.toString(bs.get(i1)));
System.out.println(Bytes.toString(bs.get(i2)));
bs.remove(i1);
}
}
}
byte[][] tbs = new byte[bs.toArray().length][1000];
admin1.createTable(targetDesc, bs.toArray(tbs));
admin1.close();
connection1.close();
admin.close();
connection.close();
}
}