gpt4 book ai didi

java - HBase 更新现有行

转载 作者:行者123 更新时间:2023-12-01 14:04:18 25 4
gpt4 key购买 nike

我的日志数据以以下格式存储在 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

目标表(目标表中,2013/09/25运行mapreduce后,将单词添加为key,将计数总和添加为column.data)

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

每天都会将数据添加到源表中。但我不想对所有源表数据进行 MapReduce。所以我尝试只对当天添加的数据进行 map 缩减。

源表于 2013 年 9 月 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 表中得到以下内容。

包含新数据的目标表(由于键相同,因此苹果和橙子的计数更新为 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

我可以映射reduce部分数据并将计数添加到dest表计数列还是我需要每次都映射reduce所有数据?

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

map 功能:

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 时,您可以将列视为计数器。你可以IncrementincrementColumnValue到。它的一个很好的功能是每个增量都是原子的,因此您可以同时从多个源(映射)进行增量,并且总数将是正确的。

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

关于java - HBase 更新现有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19051003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com