Использование существующих таблиц HBase

Раздел Использование SQLLine для работы с Phoenix объясняет, как создавать новые таблицы в HBase с помощью Phoenix. Однако Phoenix позволяет также работать с существующими таблицами HBase в режиме чтения. Для этой цели создают представления (view) таблицы HBase. При их создании оригинальные метаданные HBase остаются неизменными.

Рассмотрим для примера таблицу people_ages. Используйте HBase shell для проверки наличия этой таблицы:

list

Пример вывода:

TABLE
BEST_BOOKS
SYSTEM.CATALOG
SYSTEM.FUNCTION
SYSTEM.LOG
SYSTEM.MUTEX
SYSTEM.SEQUENCE
SYSTEM.STATS
ns1:temp2
people_ages
t4
t5
t6
table10
temp1
temp10
wordcount
wordcount2
wordcount3
wordcount4
19 row(s)
Took 0.0428 seconds
=> ["BEST_BOOKS", "SYSTEM.CATALOG", "SYSTEM.FUNCTION", "SYSTEM.LOG", "SYSTEM.MUTEX", "SYSTEM.SEQUENCE", "SYSTEM.STATS", "ns1:temp2", "people_ages", "t4", "t5", "t6", "table10", "temp1", "temp10", "wordcount", "wordcount2", "wordcount3", "wordcount4"]

Эта таблица пока не доступна в Phoenix. Проверьте это с помощью соответствующей команды в SQLLine:

!tables

Вывод на экран не содержит people_ages:

+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABLE |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------+
|            | SYSTEM       | CATALOG     | SYSTEM TABLE  |          |            |                            |                 |              | false     |
|            | SYSTEM       | FUNCTION    | SYSTEM TABLE  |          |            |                            |                 |              | false     |
|            | SYSTEM       | LOG         | SYSTEM TABLE  |          |            |                            |                 |              | true      |
|            | SYSTEM       | SEQUENCE    | SYSTEM TABLE  |          |            |                            |                 |              | false     |
|            | SYSTEM       | STATS       | SYSTEM TABLE  |          |            |                            |                 |              | false     |
|            |              | BEST_BOOKS  | TABLE         |          |            |                            |                 |              | false     |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------+

Для создания представления (view) в Phoenix выполните следующую команду в SQLLine:

CREATE VIEW "people_ages" ("pk" VARCHAR PRIMARY KEY, "basic"."age" UNSIGNED_SMALLINT);

Теперь с помощью Phoenix можно выбирать данные из оригинальной таблицы HBase:

SELECT * FROM "people_ages" LIMIT 10;

Вывод на экран:

+--------------------+--------+
|         pk         |  age   |
+--------------------+--------+
| Abbott Delia       | 13874  |
| Abbott Howard      | 12852  |
| Abbott Jack        | 12857  |
| Adams Clyde        | 12857  |
| Aguilar Myrtie     | 12851  |
| Aguilar Terry      | 13877  |
| Alexander Derrick  | 13366  |
| Alexander Gregory  | 13620  |
| Alexander Leon     | 13362  |
| Allen Austin       | 13108  |
+--------------------+--------+
10 rows selected (0.029 seconds)

Определите количество строк в таблице:

SELECT COUNT(*) FROM "people_ages";

Вывод на экран:

+-----------+
| COUNT(1)  |
+-----------+
| 997       |
+-----------+
1 row selected (0.039 seconds)

Теперь в списке таблиц Phoenix вы увидите представление people_ages. Вы можете удалить его позднее, используя команду DROP VIEW.

!tables

Вывод на экран:

+------------+--------------+--------------+---------------+----------+------------+----------------------------+-----------------+--------------+----------+
| TABLE_CAT  | TABLE_SCHEM  |  TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABL |
+------------+--------------+--------------+---------------+----------+------------+----------------------------+-----------------+--------------+----------+
|            | SYSTEM       | CATALOG      | SYSTEM TABLE  |          |            |                            |                 |              | false    |
|            | SYSTEM       | FUNCTION     | SYSTEM TABLE  |          |            |                            |                 |              | false    |
|            | SYSTEM       | LOG          | SYSTEM TABLE  |          |            |                            |                 |              | true     |
|            | SYSTEM       | SEQUENCE     | SYSTEM TABLE  |          |            |                            |                 |              | false    |
|            | SYSTEM       | STATS        | SYSTEM TABLE  |          |            |                            |                 |              | false    |
|            |              | BEST_BOOKS   | TABLE         |          |            |                            |                 |              | false    |
|            |              | people_ages  | VIEW          |          |            |                            |                 |              | false    |
+------------+--------------+--------------+---------------+----------+------------+----------------------------+-----------------+--------------+----------+

Для представлений в Phoenix поддерживается только чтение, поэтому при попытке изменить данные в них вы получите сообщение об ошибке, как показано ниже:

Сообщение об ошибке
0: jdbc:phoenix:> UPSERT INTO "people_ages" values('Test Test', 100);
Error: ERROR 505 (42000): Table is read only. (state=42000,code=505)
org.apache.phoenix.schema.ReadOnlyTableException: ERROR 505 (42000): Table is read only.
        at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:359)
        at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:784)
        at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:770)
        at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:401)
        at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:391)
        at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
        at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:390)
        at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:378)
        at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1825)
        at sqlline.Commands.execute(Commands.java:822)
        at sqlline.Commands.sql(Commands.java:732)
        at sqlline.SqlLine.dispatch(SqlLine.java:813)
        at sqlline.SqlLine.begin(SqlLine.java:686)
        at sqlline.SqlLine.start(SqlLine.java:398)
        at sqlline.SqlLine.main(SqlLine.java:291)
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней