我在hbase中的日志数据采用以下格式。
hbase源表
---------------------
date(table key) word count
---------------------
2013/09/25 apple 5
2013/09/25 mangoes 2
2013/09/25 oranges 6
2013/09/25 apple 2
2013/09/25 mangoes 3
2013/09/25 mangoes 1
dest table(在目标表中,在2013/09/25运行mapreduce后,该词被添加为键,计数总和为column.data)
------------------
word(table key) count
------------------
apple 7
oranges 6
mangoes 6
每天都会将数据添加到源表中。但我不想为所有源表数据执行map reduce。所以我尝试仅对当天添加的数据进行map reduce。
在2013/09/26添加新数据的源表。
---------------------
date(table key) word count
---------------------
2013/09/25 apple 5
2013/09/25 mangoes 2
2013/09/25 oranges 6
2013/09/25 apple 2
2013/09/25 mangoes 3
2013/09/25 mangoes 1
2013/09/26 apple 10
2013/09/26 oranges 20
当我只为2013/09/26 data.i做mapreduce时,我在dest表中得到以下内容。
使用新数据的目标表(由于密钥相同,苹果和橙子的计数使用2013/09/26 data.old数据更新至2013/09/25):
------------------
word(table key) count
------------------
apple 10
oranges 10
mangoes 6
预期的目标表:
------------------
word(table key) count
------------------
apple 17
oranges 16
mangoes 6
我可以映射减少部分数据并将计数添加到dest表计数列,还是每次都需要映射减少所有数据?
如果我可以映射减少部分数据并更新计数,我该怎么做呢。我的地图缩小功能。
地图功能:
public void map(ImmutableBytesWritable row,Result value,Context context) throws IOException {
ImmutableBytesWritable key = new ImmutableBytesWritable(row.get());
String cf = "data";
String column1 = "word";
String column2 = "count";
String word = new String(result.getValue(Bytes.toBytes(cf),Bytes.toBytes(column1)));
Text t = new Text(word);
context.write(t,value);
}
减少功能:
public void reduce(Text key,Iterable<Result> values,Context context) throws IOException,InterruptedException {
int count=0;
String cf = "data";
String column = "count";
for(Result val :values) {
int d = Integer.parseInt(new String(result.getValue(Bytes.toBytes(cf),Bytes.toBytes(column))))
count += d;
}
Put put = new Put(Bytes.toBytes(key.toString()));
put.add(cf.getBytes(), column.getBytes(), String.valueOf(count).getBytes());
context.write(null, put);
}
答案 0 :(得分:1)
使用HBase时,您可以将列视为计数器。你可以Increment或incrementColumnValue来。关于它的一个很好的特性是每个增量都是原子的,所以你可以同时从多个源(地图)递增,总数也是正确的。
要在地图(或简化)中使用它,您需要自己写入HBase,而不是通过上下文 - 您可以在设置方法中打开表并在清理中关闭(甚至增加总数)
答案 1 :(得分:0)
数据没有消失。由于您将数据放在同一个单元格中,因此它将作为新版本。扫描表时,默认情况下只会看到最新版本。您需要编写逻辑以将新计数添加到先前的计数,然后将最终值插入表中。
如果您不想保留多个版本,则需要在将最终计数放入表格之前删除旧版本,自行处理。