前提:已经正确安装phoenix,并使用 !tables,正确展示默认表
如下所示
0: jdbc:phoenix:> !tables
+------------+--------------+-------------+---------------+----------+------------+---------+
| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE_NAME | SELF_RE |
+------------+--------------+-------------+---------------+----------+------------+---------+
| | SYSTEM | CATALOG | SYSTEM TABLE | | | |
| | SYSTEM | FUNCTION | SYSTEM TABLE | | | |
| | SYSTEM | LOG | SYSTEM TABLE | | | |
| | SYSTEM | SEQUENCE | SYSTEM TABLE | | | |
| | SYSTEM | STATS | SYSTEM TABLE | | | |
+------------+--------------+-------------+---------------+----------+------------+---------+
重现坑的场景:在Phoenix创建一个视图映射Hbase对应表,在这里我要映射的时 VIRTUAL_STATIONS 表
创建脚本如下:
create view VIRTUAL_STATIONS(
"ROWKEY" varchar primary key ,
"f1"."CITY_ID" varchar,
"f1"."DISTRICT_NAME" varchar,
"f1"."STARTING_LNG" varchar,
"f1"."STARTING_LAT" varchar
) as select * from VIRTUAL_STATIONS;
报错:
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.query.ConnectionQueryServicesImpl.ensureTableCreated(ConnectionQueryServicesImpl.java:1115)
at org.apache.phoenix.query.ConnectionQueryServicesImpl.createTable(ConnectionQueryServicesImpl.java:1491)
at org.apache.phoenix.schema.MetaDataClient.createTableInternal(MetaDataClient.java:2717)
at org.apache.phoenix.schema.MetaDataClient.createTable(MetaDataClient.java:1114)
at org.apache.phoenix.compile.CreateTableCompiler$1.execute(CreateTableCompiler.java:192)
at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:408)
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:389)
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)
解决方法:
1.在表名添加双引号 ===》 无效
2.查询Hbase表,发现Hbase内未发现 VIRTUAL_STATIONS 该表,执行程序落地Hbase数据生成表后,
再次在Phoenix执行上述脚本即正常 ===》OK
Hbase表:
hbase(main):004:0> list
TABLE
HTAB_GPS
HTAB_HAIKOU_ORDER
SYSTEM.CATALOG
SYSTEM.FUNCTION
SYSTEM.LOG
SYSTEM.MUTEX
SYSTEM.SEQUENCE
SYSTEM.STATS
VIRTUAL_STATIONS
9 row(s) in 0.0120 seconds
Phoenix正常执行:
0: jdbc:phoenix:> create view VIRTUAL_STATIONS(
. . . . . . . . > "ROWKEY" varchar primary key ,
. . . . . . . . > "f1"."CITY_ID" varchar,
. . . . . . . . > "f1"."DISTRICT_NAME" varchar,
. . . . . . . . > "f1"."STARTING_LNG" varchar,
. . . . . . . . > "f1"."STARTING_LAT" varchar
. . . . . . . . > ) as select * from VIRTUAL_STATIONS;
No rows affected (6.198 seconds)