Java 使用现有值在HBase中向上插入

Java 使用现有值在HBase中向上插入,java,hbase,put,Java,Hbase,Put,我使用HBase来存储一些流数据,我的值从一个插入到另一个插入,并使用现有的值 我创建了一个如下表: hbase(main):005:0> create ‘mytable’,’mycolfam’ 该表将包含一个名为val的字段 首先,我插入数据(key=1,val=10): 然后,我有相同键“1”(键=1,val=12)的传入数据,HBase中插入的值必须是新值和旧值的总和(10+12) 我尝试了Get first来获取旧值,但我想以一种更优化的方式进行 有人知道怎么做吗? 谢谢。您可以

我使用HBase来存储一些流数据,我的值从一个插入到另一个插入,并使用现有的值

我创建了一个如下表:

hbase(main):005:0> create ‘mytable’,’mycolfam’
该表将包含一个名为val的字段

首先,我插入数据(key=1,val=10):

然后,我有相同键“1”(键=1,val=12)的传入数据,HBase中插入的值必须是新值和旧值的总和(10+12)

我尝试了Get first来获取旧值,但我想以一种更优化的方式进行

有人知道怎么做吗?
谢谢。

您可以为此使用计数器和增量。它将在单个事务中执行,而不是执行get和put来增加值

请注意,存储的值是二进制格式的

hbase(main):003:0> incr 'mytable', '1', 'mycolfam:val', 1
COUNTER VALUE = 1
Took 0.1761 seconds
hbase(main):004:0> get 'mytable', '1', 'mycolfam:val'
COLUMN                                    CELL
 mycolfam:val                             timestamp=1554226437325, value=\x00\x00\x00\x00\x00\x00\x00\x01
1 row(s)
Took 0.0379 seconds
hbase(main):005:0> incr 'mytable', '1', 'mycolfam:val', 10
COUNTER VALUE = 11
Took 0.0086 seconds
hbase(main):006:0> get 'mytable', '1', 'mycolfam:val'
COLUMN                                    CELL
 mycolfam:val                             timestamp=1554226478551, value=\x00\x00\x00\x00\x00\x00\x00\x0B
1 row(s)
Took 0.0207 seconds
hbase(main):007:0>

要从值中减去,只需使用负数作为最后一个参数。

是的,但如果我想进行复杂的计算?例如(oldVal*2+newVal*3)/2?使用计数器不支持此操作。为此,必须在客户端计算表达式。这是有问题的,因为它不会在事务中执行,因此值可能会同时更改。
hbase(main):005:0> put 'mytable','1','mycolfam:val',oldvalue+newvalue
hbase(main):003:0> incr 'mytable', '1', 'mycolfam:val', 1
COUNTER VALUE = 1
Took 0.1761 seconds
hbase(main):004:0> get 'mytable', '1', 'mycolfam:val'
COLUMN                                    CELL
 mycolfam:val                             timestamp=1554226437325, value=\x00\x00\x00\x00\x00\x00\x00\x01
1 row(s)
Took 0.0379 seconds
hbase(main):005:0> incr 'mytable', '1', 'mycolfam:val', 10
COUNTER VALUE = 11
Took 0.0086 seconds
hbase(main):006:0> get 'mytable', '1', 'mycolfam:val'
COLUMN                                    CELL
 mycolfam:val                             timestamp=1554226478551, value=\x00\x00\x00\x00\x00\x00\x00\x0B
1 row(s)
Took 0.0207 seconds
hbase(main):007:0>