问题描述
我使用的是 Hbase 2.0.2 版和 phoenix V5.0.0。我在上面有一个 HBase 表我们已经创建了 Phoenix 视图,使用以下步骤
hbase(main):007:0> create 'phownix_test','details'
hbase(main):008:0> put 'phownix_test','1','details:MAC','1234567'
Took 1.5056 seconds
hbase(main):009:0> put 'phownix_test','details:deviceName','RAINDEVICE'
Took 0.0101 seconds
hbase(main):010:0> put 'phownix_test','details:CO2','234.543'
Took 0.0079 seconds
hbase(main):011:0> put 'phownix_test','details:latitude','9876543'
Took 0.0084 seconds
hbase(main):012:0> scan 'phownix_test'
ROW COLUMN+CELL
1 column=details:CO2,timestamp=1609744038606,value=234.543
1 column=details:MAC,timestamp=1609744024895,value=1234567
1 column=details:deviceName,timestamp=1609744031974,value=RAINDEVICE
1 column=details:latitude,timestamp=1609744051328,value=9876543
然后我在 HBase 表的顶部创建了一个凤凰视图。
create view "phownix_test"("ID" VARCHAR primary key,"details"."MAC" UNSIGNED_INT,"details"."CO2" UNSIGNED_FLOAT,"details"."deviceName" VARCHAR,"details"."latitude" UNSIGNED_LONG);
从 phoenix 视图中选择数据时出现以下错误。
0: jdbc:phoenix:> select * from "phownix_test";
Error: ERROR 201 (22000): Illegal data. Expected length of at least 51 bytes,but had 23 (state=22000,code=201)
java.sql.sqlException: ERROR 201 (22000): Illegal data. Expected length of at least 51 bytes,but had 23
at org.apache.phoenix.exception.sqlExceptionCode$Factory$1.newException(sqlExceptionCode.java:503)
at org.apache.phoenix.exception.sqlExceptionInfo.buildException(sqlExceptionInfo.java:150)
at org.apache.phoenix.schema.keyvalueSchema.next(keyvalueSchema.java:214)
at org.apache.phoenix.expression.ProjectedColumnExpression.evaluate(ProjectedColumnExpression.java:116)
at org.apache.phoenix.compile.ExpressionProjector.getValue(ExpressionProjector.java:69)
at org.apache.phoenix.jdbc.PhoenixResultSet.getString(PhoenixResultSet.java:635)
at sqlline.Rows$Row.<init>(Rows.java:183)
at sqlline.BufferedRows.<init>(BufferedRows.java:38)
at sqlline.sqlLine.print(sqlLine.java:1660)
at sqlline.Commands.execute(Commands.java:833)
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)
解决方法
如果您要向现有 HBase 表添加 Phoenix 视图,则必须确保存储在表中的值按照 Phoenix 预期的方式编码为字节。由于您是从 HBase shell 而不是通过 Phoenix 将数据写入表中,因此这可能不会发生(您的错误消息表明情况确实如此)。
如果是新表,不要使用 HBase shell——而是使用 Phoenix SQL 命令来创建表。这样一切都将按照 Phoenix 期望的方式进行配置。之后只使用 Phoenix 与数据交互(写入、查询、创建视图等),以避免与不同编码等相关的问题。
,我们只插入 Hbase 的那一刻我们必须以二进制格式对数据进行编码。然后我们可以相应地创建具有所需数据类型的 Phoenix 视图。它对我有用