Apache Phoenix非法数据异常

问题描述 投票:2回答:1

我在从HBase写入数据并使用Phoenix读取数据时遇到问题。这些是重现问题的步骤:

使用Phoenix创建一个表。

 CREATE TABLE test (
    id varchar not null,
    t1.a unsigned_int,
    t1.b varchar
    CONSTRAINT pk PRIMARY KEY (id))
 COLUMN_ENCODED_BYTES = 0;

如果我使用Upsert使用Phoenix向表中添加信息

upsert into test (id, t1.a, t1.b) values ('a1',1,'foo_a');

我尝试查询表,我得到这个:

select * from test;

+-----+----+--------+
| ID  | A  |   B    |
+-----+----+--------+
| a1  | 1  | foo_a  |
+-----+----+--------+

此时一切都按预期工作,但现在我将直接使用HBase添加一个新条目。

put 'TEST', 'id_1','T1:A', 2
put 'TEST', 'id_1','T1:B','some text'

之后我不能再查询表了,得到这个:

select * from test;
Error: ERROR 201 (22000): Illegal data. Expected length of at least 4 bytes, but had 1 (state=22000,code=201)

我知道问题与HBase如何存储unsigned_int有关,如果我从表中删除此列,查询将再次起作用。怎样才能解决这个问题?

sql hbase phoenix
1个回答
0
投票

问题似乎与HBase如何存储数据有关,如果我扫描表格,我会得到这个:

ROW                           COLUMN+CELL
 a1                           column=T1:A, timestamp=1551274930165, value=\x00\x00\x00\x01
 a1                           column=T1:B, timestamp=1551274930165, value=foo_a
 a1                           column=T1:_0, timestamp=1551274930165, value=x
 id_1                         column=T1:A, timestamp=1551274993067, value=2
 id_1                         column=T1:B, timestamp=1551275070577, value=some text

这意味着新的整数值存储为字符串,因此存储此数据的正确方法应该是:

put 'TEST', 'id_1','T1:A', "\x00\x00\x00\x02"

完成后,扫描将为我们提供:

ROW                           COLUMN+CELL
 a1                           column=T1:A, timestamp=1551274930165, value=\x00\x00\x00\x01
 a1                           column=T1:B, timestamp=1551274930165, value=foo_a
 a1                           column=T1:_0, timestamp=1551274930165, value=x
 id_1                         column=T1:A, timestamp=1551274993067, value=\x00\x00\x00\x02
 id_1                         column=T1:B, timestamp=1551275070577, value=some text

凤凰城可以毫无问题地访问数据。 感谢鲍里斯提示。

© www.soinside.com 2019 - 2024. All rights reserved.