HBase 更新现有行



我的日志数据在 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数据进行MapReduce时,我在dest表中得到了以下内容。

带有新数据的 dest 表(由于键相同,Apple 和 Oranges 的计数使用 2013/09/26 数据更新。截至 2013/09/25 的旧数据消失了(:

------------------
word(table key) count
------------------
apple 10
oranges 10
mangoes 6 

预期目标表:

------------------
word(table key) count
------------------
apple 17
oranges 16
mangoes 6 
我可以映射减少

部分数据并将计数添加到目标表计数列,还是每次都需要映射减少所有数据?

如果我能映射减少部分数据并更新计数,我该怎么做。这是我的地图减少功能。

地图功能:

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);
}    

使用 HBase 时,可以将列视为计数器。 您可以递增或递增列值到。关于它的好功能是每个增量都是原子的,因此您可以同时从多个源(映射(递增,并且总数是正确的。

要在映射(或减少(中使用它,您需要自己写入HBase,而不是通过上下文 - 您可以在设置方法中打开表并在清理中关闭(甚至增加总数(

数据不会消失。由于您将数据放在同一个单元格中,因此它将作为新版本。默认情况下,扫描表时,您只能看到最新版本。您需要编写逻辑以将新计数添加到以前的计数中,然后将最终值插入到表中。

如果您不想保留多个版本,则需要在将最终计数放入表中之前通过删除旧版本来自己处理它。

相关内容

  • 没有找到相关文章

最新更新