Apache Phoenix Upsert Into Table Select * from View

Apache Phoenix Upsert Into Table Select * from View

我已经从 HBase 创建了一个 Phoenix View table,然后从它创建了一个 Phoenix 视图,最后尝试插入到一个新的 :

create view "personal" (k VARCHAR primary key, "personal_data"."name" VARCHAR);

select * from "personal";

+--------+-------------------------------+
|   K    |             name              |
+--------+-------------------------------+
| 0      | Darrell Clark                 |
| 1      | Elizabeth Baker               |
| 10     | Brad Alexander                |
| 100    | Douglas Morris                |
| 1000   | Joel Boyd                     |
| 10000  | Christine Wood                |
| 10001  | Thomas Wilson                 |
| 10002  | Laura Salinas                 |
| 10003  | Audrey Norris                 |
| 10004  | Kristen Klein                 |
| 10005  | Vanessa Brooks                |
| 10006  | Mary Flynn                    |
| 10007  | Margaret Mullen               |

然后我创建一个凤凰table:

create table if not exists personal_table (name VARCHAR, k VARCHAR CONSTRAINT my_pk PRIMARY KEY (name, k));

然后我尝试更新插入:

UPSERT INTO personal_table SELECT * FROM personal;

Error: ERROR 1012 (42M03): Table undefined. tableName=PERSONAL (state=42M03,code=1012)
org.apache.phoenix.schema.TableNotFoundException: ERROR 1012 (42M03): Table undefined. tableName=PERSONAL
    at org.apache.phoenix.compile.FromCompiler$BaseColumnResolver.createTableRef(FromCompiler.java:582)
    at org.apache.phoenix.compile.FromCompiler$SingleTableColumnResolver.<init>(FromCompiler.java:396)
    at org.apache.phoenix.compile.FromCompiler.getResolverForQuery(FromCompiler.java:228)
    at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:504)
    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.call(PhoenixStatement.java:401)
    at org.apache.phoenix.jdbc.PhoenixStatement.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)

可能是什么问题?是否可以从视图中 Upsert into table select *?谢谢!

Is it possible to Upsert into table select * from view?

不,事实并非如此。 upsert 语句中缺少引号导致了这种情况。 "与 CREATE TABLE 一样,table、列族和列名都是大写的,除非它们被双引号括起来

UPSERT INTO personal_table SELECT * FROM personal;

应该是->

UPSERT INTO personal_table SELECT * FROM "personal";

我在本地试过你的案例(修复)。这是我在 HBase Shell:

上执行的
// create personel table on hbase
create 'personel', {NAME => 'personal_data', VERSIONS => 5}

put 'personel','1','personal_data:name','quaresma'
put 'personel','2','personal_data:name','cenk'
put 'personel','3','personal_data:name','fabri'
put 'personel','4','personal_data:name','pepe'
put 'personel','5','personal_data:name','talisca'

scan 'personel'

然后我切换到 phoenix-sqlline 并执行以下命令:

CREATE VIEW "personel" (k VARCHAR PRIMARY KEY, "personal_data"."name" VARCHAR);

SELECT * FROM "personel";

create table if not exists personal_table (name VARCHAR, k VARCHAR CONSTRAINT my_pk PRIMARY KEY (name, k));

UPSERT INTO personal_table SELECT * FROM "personel";

select * from personal_table;