Spark中的Phoenix Dynamic Columns

代码及使用示例:https://github.com/wlu-mstr/spark-phoenix-dynamic

phoenix dynamic columns

HBase的数据模型是动态的,很多系统得益于这一特性。在使用了Phoenix后自然也希望继续使用动态schema特性,有幸,Phoenix支持dynamic column.

例如:
Query

SELECT eventTime, lastGCTime, usedMemory, maxMemory
FROM EventLog(lastGCTime TIME, usedMemory BIGINT, maxMemory BIGINT)
WHERE eventType = 'OOM' AND lastGCTime < eventTime - 1
Where you may have defined only a subset of your event columns at create time, since each event type may have different properties:

建表

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);

Spark 中使用Phoenix

Phoenix 提供了Spark的插件,通过saveToPhoenix 插入数据。但是不支持dynamic插入特性。

解决思路

  • 重写两个Function去实现新的saveToPhoenix;
  • upsert sql由用户去写,而不是拼装生成;
  • 动态列的ColumnType其实不影响upesrt语句的执行,只要动态列的数据类型和upsert sql中动态列类型兼容即可。
posted @ 2018-04-02 11:37  wlu  阅读(1051)  评论(0编辑  收藏  举报