总结:看似很有用,但是很少有这样的需求,而且查询时候需要知道对应的列是哪个,否则无法查询出对应的数据,这些列需要被额外的保存,这样的设计更像是之前做毁的项目,通过这种方式进行补救。
有时候预先定义好的静态模式是不可行的。相反,可以在表创建时指定列的子集,而在查询时指定其余列。从Phoenix1.2后,现在支持动态地指定列,方法是允许在SELECT语句的FROM子句中的表后面的括号中包含列定义。虽然这不是标准的SQL,但是利用HBase的后期绑定能力来提供这种类型的功能是很有用的。
举例:
SELECT eventTime, lastGCTime, usedMemory, maxMemory
FROM EventLog(lastGCTime TIME, usedMemory BIGINT, maxMemory BIGINT)
WHERE eventType = 'OOM' AND lastGCTime < eventTime - 1
在创建时,您可能只定义了事件列的一个子集,因为每个事件类型可能具有不同的属性:
CREATE TABLE EventLog (
eventId BIGINT NOT NULL,
eventTime TIME NOT NULL,
eventType CHAR(3)
CONSTRAINT pk PRIMARY KEY (eventId, eventTime))
去更新一行和动态列:
UPSERT INTO EventLog (
eventId, eventTime,
eventType,
lastGCTime TIME,
usedMemory BIGINT,
maxMemory BIGINT)
VALUES(1, CURRENT_TIME(), ‘abc’, CURRENT_TIME(), 512, 1024);
网友评论