Hadoop 在mapreduce期间在HBase表的另一行中查找具有特定列值的行

Hadoop 在mapreduce期间在HBase表的另一行中查找具有特定列值的行,hadoop,mapreduce,hbase,Hadoop,Mapreduce,Hbase,我使用一个HBase表来存储事件,我想用请求事件的响应事件的输出来更新请求事件。这两个值都存储在HBase表中的两个不同行上 这就是我遇到的困境。我想使用一个mapreduce作业,它将接收所有响应行,并用响应行的状态更新请求行。响应和请求都具有匹配的用户id,但行由相关id索引。行键的格式为(event_corrID_userID)。从现在到那时,相关ID可能已更改,但用户ID将始终保持不变 这就是我的全部情况。在mapreduce期间,如何在表内(在其他行中)搜索?以下是我目前掌握的情况:

我使用一个HBase表来存储事件,我想用请求事件的响应事件的输出来更新请求事件。这两个值都存储在HBase表中的两个不同行上

这就是我遇到的困境。我想使用一个mapreduce作业,它将接收所有响应行,并用响应行的状态更新请求行。响应和请求都具有匹配的用户id,但行由相关id索引。行键的格式为(event_corrID_userID)。从现在到那时,相关ID可能已更改,但用户ID将始终保持不变

这就是我的全部情况。在mapreduce期间,如何在表内(在其他行中)搜索?以下是我目前掌握的情况:

public class MapReducer {
    public static void main(String[] args){
        Configuration config = HBaseConfiguration.create();
        try{
            String startRow = "response_";
            String endRow = "responsf_";
            Job job = new Job(config, "TestAuditingResponse");
            job.setJarByClass(MapReducer.class);
            Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(endRow));
            scan.setCaching(500);
            scan.setCacheBlocks(false);

            TableMapReduceUtil.initTableMapperJob(
                    "test",
                    scan,
                    mapper.class,
                    null,
                    null,
                    job);
            TableMapReduceUtil.initTableReducerJob(
                    "test",
                    null,
                    job);
            job.setNumReduceTasks(0);

            boolean b = job.waitForCompletion(true);
            if(!b){
                throw new IOException("ERROR WITH JOB");
            }
        } catch(IOException e){
            e.printStackTrace();
        } catch(ClassNotFoundException e){
            e.printStackTrace();
        } catch(InterruptedException e){
            e.printStackTrace();
        }
    }
    public static class mapper extends TableMapper<ImmutableBytesWritable, Put> {
        public void map(ImmutableBytesWritable row, Result value, Context context) throws IOException, InterruptedException {
            //TODO find row to put new value into
        }
    }

}
公共类MapReducer{
公共静态void main(字符串[]args){
Configuration config=HBaseConfiguration.create();
试一试{
String startRow=“response_”;
字符串endRow=“responsf_2;”;
作业作业=新作业(配置,“TestAuditingResponse”);
job.setJarByClass(MapReducer.class);
扫描扫描=新扫描(Bytes.toBytes(startRow),Bytes.toBytes(endRow));
扫描设置缓存(500);
scan.setCacheBlocks(false);
TableMapReduceUtil.initTableMapperJob(
“测试”,
扫描
mapper.class,
无效的
无效的
工作);
TableMapReduceUtil.initTableReducerJob(
“测试”,
无效的
工作);
job.setNumReduceTasks(0);
布尔b=作业。等待完成(true);
如果(!b){
抛出新IOException(“作业错误”);
}
}捕获(IOE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共静态类映射器扩展了TableMapper{
公共void映射(ImmutableBytesWritable行、结果值、上下文上下文)引发IOException、InterruptedException{
//TODO查找要将新值放入的行
}
}
}

有人知道我怎么做吗?还是一种更好/更快的方法,以分布式/易于运行的方式基于表中的其他行更新表?

似乎您要“连接”一个表内部。您可以对此进行检查。

仔细查看,这似乎可以让我提前设置扫描,然后将两者都传入,然后它将按顺序运行扫描。这似乎不允许你在一张桌子里寻找另一行,因为我必须提前通过扫描?当我可以访问当前行的相关ID和声明ID时,我仍然需要确定我要查找的行,所以我不知道是否可以像那样提前设置它?