hbase 使用复制表,使用存在表的结构

使用以下代码可以按照存在的表结构复制出新的表

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

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值