0

我想为单元格值设置增量,所以我在 HBase 表上运行了“incr”命令。但出现以下错误:

错误:org.apache.hadoop.hbase.DoNotRetryIOException:org.apache.hadoop.hbase.DoNotRetryIOException:试图增加不是 64 位宽的字段

以下是我运行的命令:

hbase(main):022:0> create 'test1', {NAME => 'foo', VERSIONS => 1}
0 row(s) in 1.0440 seconds

hbase(main):023:0> put 'test1', 'spam', 'foo:bar', 1
0 row(s) in 0.0120 seconds

hbase(main):024:0> scan 'test1'
ROW                                         COLUMN+CELL
 spam                                       column=foo:bar, timestamp=1372922338444, value=1
1 row(s) in 0.0140 seconds

hbase(main):025:0> incr 'test1', 'spam', 'foo:bar', 1

ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: org.apache.hadoop.hbase.DoNotRetryIOException: Attempted to increment field that isn't 64 bits wide

Here is some help for this command:
Increments a cell 'value' at specified table/row/column coordinates.
To increment a cell value in table 't1' at row 'r1' under column
'c1' by 1 (can be omitted) or 10 do:

  hbase> incr 't1', 'r1', 'c1'
  hbase> incr 't1', 'r1', 'c1', 1
  hbase> incr 't1', 'r1', 'c1', 10


hbase(main):026:0>

任何想法,我该如何解决这个问题?

4

3 回答 3

2

错误在于计数器初始化。您不需要初始化计数器。当列第一次用 8 字节长1值递增时,它将被初始化,而在您的情况下,它是用 4 字节整数1初始化的。正确用法是:

hbase(main):012:0> create 'test', {NAME => 'foo', VERSIONS => 1}
0 row(s) in 0.1470 seconds

=> Hbase::Table - test
hbase(main):013:0> incr 'test', 'spam', 'foo:bar', 1
COUNTER VALUE = 1
0 row(s) in 0.0080 seconds

hbase(main):014:0> incr 'test', 'spam', 'foo:bar', 1
COUNTER VALUE = 2
0 row(s) in 0.0060 seconds

hbase(main):015:0> incr 'test', 'spam', 'foo:bar', 1
COUNTER VALUE = 3
0 row(s) in 0.0040 seconds
于 2016-04-19T15:22:29.317 回答
1

如果要使用该数字初始化为零增量以外的值,则需要从一开始就使用增量

所以在你的情况下你应该

incr 'test1', 'spam', 'foo:bar', 1
incr 'test1', 'spam', 'foo:bar', 1

获得计数器值 2

于 2013-07-04T14:55:21.490 回答
1

在我的情况下,我遇到了同样的问题,指定增量位置的值是一个整数。我将值更改为 long

put.add(Bytes.toBytes("columnar"),Bytes.toBytes("column11111"), Bytes.toBytes(1l));

并执行它工作的增量操作。

incr 'blah-blah','row111','columnar:column11111',11
于 2013-09-02T06:36:23.637 回答