检查Hbase行是否存在使用MapReduce将数据导入Hbase

时间:2016-09-22 06:55:25

标签: hadoop mapreduce hbase

我在Hbase中有一个名为Table1的表,其中包含这样的集合行

<Image_Id, <float,float,.....>>
带有Image_Id的

表示图像id,后跟一系列浮点数。

然后我想读取这个表数据,处理然后将新值存储到另一个表(假设新表名为表2并且第一次为空)。

我使用MapReduce

实现此任务
TableMapReduceUtil.initTableMapperJob(
            "Table1",      // input table
            scan,             // Scan instance to control CF and attribute selection
            MyMapper.class,   // mapper class
            null,             // mapper output key
            null,             // mapper output value
            job);
        TableMapReduceUtil.initTableReducerJob(
            "Table2",      // output table
            null,             // reducer class
            job);
        job.setNumReduceTasks(0);

例如在mapper中

public static class MyMapper extends TableMapper<ImmutableBytesWritable, Put>  {

        public void map(ImmutableBytesWritable row, Result value, Context context) throws IOException, InterruptedException {
          //read data in table 1 here
        }
    }

假设我在表1中的每一行中读取了一个值,那么我将像

一样将其哈希
int hcode = hash(GetRowValue())

然后将此hode插入到Table2中,就像这样

context.write(hcode, Image_ID);
带有行键的

是哈希码,值是表1中对应的Image_ID

问题在于,如果hcode之前与其他人类似,我将使用List&lt;&gt;以<hashCode, <Image_ID1, Image_ID2>>的形式更新表2中的这一行。存储价值清单。为此,我将检查表2中是否存在rowkey,然后插入新的或更新当前行。

但是在运行我的代码之后,我看到只有在MapReduce完成之后,Table2才会填充数据。在MapReduce进度期间,表2仍为空。

已编辑:那么有没有办法实现工作流程,例如检查Hbase表中是否存在行,然后在使用Mapreduce时更新其值?

0 个答案:

没有答案