我在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时更新其值?