Apache Phoenix незаконное исключение данных - PullRequest
0 голосов
/ 16 октября 2018

У меня проблемы с записью данных из 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;

Если я добавлю информацию в таблицу, используя Phoenix, используя Upsert

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, и если я удаляю этот столбец из таблицы,запросы снова будут работать.Как решить эту проблему?

1 Ответ

0 голосов
/ 27 февраля 2019

Проблема, по-видимому, связана с тем, как 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

И данные будут доступны из Феникса безлюбая проблема.
Спасибо Борису за подсказку.

...