'incr'命令在HBase shell中给出错误“试图增加非64位宽的字段”

时间:2013-07-04 08:21:16

标签: hbase

我想为单元格值设置增量,所以我在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>

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

3 个答案:

答案 0 :(得分:1)

你需要从开头使用增量 如果要使用该数字初始化为零增量以外的值

所以在你的情况下你应该

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

获得计数器值2

答案 1 :(得分:1)

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

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

并执行了增量操作。

incr 'blah-blah','row111','columnar:column11111',11

答案 2 :(得分:1)

错误是计数器初始化。您不需要初始化计数器。当列第一次以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