Upsert в HBase, используя существующее значение - PullRequest
2 голосов
/ 02 апреля 2019

Я использую HBase для хранения некоторых потоковых данных, и у меня есть значения, которые эволюционируют от одной вставки к другой и используют существующее значение.

У меня есть таблица, созданная следующим образом:

hbase(main):005:0> create ‘mytable’,’mycolfam’

Таблица будет содержать одно поле с именем val

Сначала я вставляю данные по мере их поступления (ключ = 1, val = 10):

hbase(main):005:0> put 'mytable','1','mycolfam:val',10

И затем, У меня есть входящие данные для того же ключа '1' (ключ = 1, val = 12), и вставленное значение в HBase должно быть суммой нового и старого значения (10 + 12).

hbase(main):005:0> put 'mytable','1','mycolfam:val',oldvalue+newvalue

Я попытался сначала получить Get, чтобы получить старое значение, но я хочу сделать это более оптимизированным способом.

Кто-нибудь знает, как это сделать?Спасибо.

1 Ответ

2 голосов
/ 02 апреля 2019

Вы можете использовать счетчики и приращение для этого.Он будет выполнен в одной транзакции в отличие от выполнения операций 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>

Для вычитания из значения простопросто используйте отрицательное число в качестве последнего параметра.

...