Использование существующих таблиц 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)