Mapreduce构建hbase二级索引
admin
2023-02-07 22:40:02
0
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
import org.apache.hadoop.hbase.mapreduce.TableInputFormat;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.GenericOptionsParser;

public class IndexBuilder {

    private class MyMapper extends TableMapper {
        private Map indexes = new HashMap();
        private String columnFamily;

        @Override
        protected void map(ImmutableBytesWritable key, Result value,
                Context context) throws IOException, InterruptedException {

            Set keys = indexes.keySet();
            for (byte[] k : keys) {

                ImmutableBytesWritable indexTableName = indexes.get(k);
                byte[] val = value.getValue(Bytes.toBytes(columnFamily), k);
                Put put = new Put(val);// 索引表的rowkey为原始表的值
                put.add(Bytes.toBytes("f1"), Bytes.toBytes("id"), key.get());// 索引表的内容为原始表的rowkey
                context.write(indexTableName, put);

            }

        }

        @Override
        protected void setup(Context context) throws IOException,
                InterruptedException {
            Configuration conf = context.getConfiguration();
            String tableName = conf.get("tableName");
            columnFamily = conf.get("columnFamily");
            String[] qualifiers = conf.getStrings("qualifiers");
            // indexes的key为列名,value为索引表名
            for (String q : qualifiers) {
                indexes.put(
                        Bytes.toBytes(q),
                        new ImmutableBytesWritable(Bytes.toBytes(tableName
                                + "-" + q)));

            }

        }

    }

    public static void main(String[] args) throws IOException,
            ClassNotFoundException, InterruptedException {
        Configuration conf = HBaseConfiguration.create();

        String[] otherargs = new GenericOptionsParser(conf, args)
                .getRemainingArgs();// 去除掉没有用的命令行参数
        // 输入参数:表名,列族名,列名
        if (otherargs.length < 3) {
            System.exit(-1);
        }
        String tableName = otherargs[0];
        String columnFamily = otherargs[1];

        conf.set("tableName", tableName);
        conf.set("columnFamily", columnFamily);

        String[] qualifiers = new String[otherargs.length - 2];
        for (int i = 0; i < qualifiers.length; i++) {

            qualifiers[i] = otherargs[i + 2];
        }
        conf.setStrings("qualifiers", qualifiers);
        Job job = new Job(conf, tableName);
        job.setJarByClass(IndexBuilder.class);
        job.setMapperClass(MyMapper.class);
        job.setNumReduceTasks(0);
        job.setInputFormatClass(TableInputFormat.class);
        // 可以输出多张表
        job.setOutputFormatClass(MultiTableOutputFormat.class);
        Scan scan = new Scan();
        scan.setCaching(1000);
        TableMapReduceUtil.initTableMapperJob(tableName, scan, MyMapper.class,
                ImmutableBytesWritable.class, Put.class, job);
        job.waitForCompletion(true);

    }

}


相关内容

热门资讯

终于了解“人民棋牌开挂器?”(... 您好:人民棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游戏...
【第一资讯】“天天爱海南麻将有... 网上科普关于“天天爱海南麻将有没有挂”话题很是火热,小编也是针对天天爱海南麻将作*弊开挂的方法以及开...
今日重大发现“新版悟空炸/金/... 今日重大发现“新版悟空炸/金/花有没有挂?”(确实真的有挂)您好,新版悟空炸/金/花这个游戏其实有挂...
今日重大消息“皇豪众娱炸/金/... 有 亲,根据资深记者爆料皇豪众娱炸/金/花是可以开挂的,确实有挂(咨询软...
玩家最新攻略“新道游牛牛有挂吗... 家人们!今天小编来为大家解答新道游牛牛透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里买...
今日重大消息“边锋老友麻将怎么... 网上科普关于“边锋老友麻将有没有挂”话题很是火热,小编也是针对边锋老友麻将作*弊开挂的方法以及开挂对...
乌克兰松口“有条件”战时选举,... 据凤凰卫视报道,美俄乌谈判多轮交锋,各方在核心问题上没有让步。不过乌方近日在选举方面释出信号,包括泽...
玩家最新攻略“小甘麻将真的有挂... 有 亲,根据资深记者爆料小甘麻将是可以开挂的,确实有挂(咨询软件无需打开...
今日重大通报“天天微友棋牌怎么... 家人们!今天小编来为大家解答天天微友棋牌透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里...
终于懂了“天天微友炸/金/花究... 家人们!今天小编来为大家解答天天微友炸/金/花透视挂怎么安装这个问题咨询软件客服徽9784099的挂...