在ApachePhoenix中创建视图:错误505

在ApachePhoenix中创建视图:错误505,phoenix,Phoenix,我不能在凤凰城执行命令 CREATE VIEW "t1" ( pk VARCHAR PRIMARY KEY, "f1".val VARCHAR ) 之后,我执行了in hbase命令 create 't1', {NAME => 'f1', VERSIONS => 5} 我得到以下错误 org.apache.phoenix.schema.ReadOnlyTableException: ERROR 505 (42000): Table is read only. at org

我不能在凤凰城执行命令

CREATE VIEW "t1" ( pk VARCHAR PRIMARY KEY, "f1".val VARCHAR )
之后,我执行了in hbase命令

create 't1', {NAME => 'f1', VERSIONS => 5}
我得到以下错误

org.apache.phoenix.schema.ReadOnlyTableException: ERROR 505 (42000): Table is read only.
    at org.apache.phoenix.query.ConnectionQueryServicesImpl.ensureTableCreated(ConnectionQueryServicesImpl.java:815)
    at org.apache.phoenix.query.ConnectionQueryServicesImpl.createTable(ConnectionQueryServicesImpl.java:1174)
    at org.apache.phoenix.schema.MetaDataClient.createTableInternal(MetaDataClient.java:1974)
    at org.apache.phoenix.schema.MetaDataClient.createTable(MetaDataClient.java:770)
    at org.apache.phoenix.compile.CreateTableCompiler$2.execute(CreateTableCompiler.java:186)
    at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:305)
    at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:297)
    at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
    at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:295)
    at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1255)
    at sqlline.Commands.execute(Commands.java:822)
    at sqlline.Commands.sql(Commands.java:732)
    at sqlline.SqlLine.dispatch(SqlLine.java:808)
    at sqlline.SqlLine.begin(SqlLine.java:681)
    at sqlline.SqlLine.start(SqlLine.java:398)
    at sqlline.SqlLine.main(SqlLine.java:292)
这些是显示在部分下的命令

如何将Phoenix表映射到现有的HBase表


您不需要创建
视图
,而需要创建
到现有的HBase表,如下所示:

CREATE TABLE "t1" ( ROWKEY VARCHAR PRIMARY KEY, "f1"."val" VARCHAR )

有关更多详细信息,您可以查看要将phoenix表映射到现有HBase表的

。不过,在问题描述中,您首先创建了Phoenix视图,然后尝试使用相同的名称创建HBase表。因此,您将获得
org.apache.phoenix.schema.ReadOnlyTableException:错误505(42000):表是只读的。
exception

而不是先创建HBase表,然后创建映射到现有HBase表的Phoenix视图

例如: 正在创建HBase表:

create 't1', {NAME => 'f1', VERSIONS => 5}
CREATE VIEW "t1" ( pk VARCHAR PRIMARY KEY, "f1".val VARCHAR )
创建指向同一HBase表的phoenix视图:

create 't1', {NAME => 'f1', VERSIONS => 5}
CREATE VIEW "t1" ( pk VARCHAR PRIMARY KEY, "f1".val VARCHAR )

“pk”列声明您的行键是VARCHAR(即字符串),而“f1”.val列声明您的HBase表将包含列族和列限定符为“f1”:val的KeyValues,它们的值将是VARCHA,您使用的是哪个版本的phoenix?您需要在查看之前创建表。这是显而易见的。前提是,如果您以正确的顺序一个接一个地运行命令,而不篡改HBase表内容,那么您的命令就可以完美地工作。如果您通过添加新列来更改模式,或者您可能会遇到映射问题,这是一个糟糕的答案,更多的是一个解决方案,无法解释真正的问题。