总结:根据业务需求而定的优化,没啥鸟用
Phoenix版本4.6现在提供一种方式去映射HBase的本地行时间戳到Phoenix的列上。这有助于利用Hbase为存储文件的时间范围提供各种优化,以及Phoenix内置的各种查询优化功能。
对于指定为ROW_TIMESTAMP的列,需要遵守如下约束:
- 只有TIME、DATE、TIMESTAMP、BIGINT、UNSIGNED_LONG类型的主键列才能指定为ROW_TIMESTAMP。
- 只有一个主键列可以指定为ROW_TIMESTAMP。
- 列值不能为空(因为它直接俄映射到Hbase的row timestamp)。这也意味着只能再创建表时,将列声明为ROW_TIMESTAMP。
- ROW_TIMESTAMP的列值不能为负。这意味着DATE、TIME、TIMESTAMP相对应着纪元时间(以毫秒为单位)不能小于零。
当更新一行在一张表上通过行时间戳时,使用UPSERT VALUES 或者UPSERT SELECT可以显式的提供时间戳列值或者让Phoenix自动设置它。如果没有指定,Phoenix将行时间戳设置成服务器端时间。列的值最终也是Hbase中相应的行时间戳。
简单的设计:
CREATE TABLE DESTINATION_METRICS_TABLE
(CREATED_DATE DATE NOT NULL,
METRIC_ID CHAR(15) NOT NULL,
METRIC_VALUE LONG
CONSTRAINT PK PRIMARY KEY(CREATED_DATE ROW_TIMESTAMP, METRIC_ID))
SALT_BUCKETS = 8;
UPSERT INTO DESTINATION_METRICS_TABLE VALUES (?, ?, ?) - 这将CREATE_DATE的值设置为相应的绑定参数中指定的值。
UPSERT INTO DESTINATION_METRICS_TABLE (METRIC_ID, METRIC_VALUE) VALUES (?, ?) - 这将CREATED_DATE的值设置为服务器端时间。
UPSERT INTO DESTINATION_METRICS_TABLE (CREATED_DATE, METRICS_ID, METRIC_VALUE) SELECT DATE, METRICS_ID, METRIC_VALUE FROM SOURCE_METRICS_TABLE -这将CREATED_DATE的值设置为从SOURCE_METRICS_TABLE中选择的日期
UPSERT INTO DESTINATION_METRICS_TABLE (METRICS_ID, METRIC_VALUE) SELECT METRICS_ID, METRIC_VALUE FROM SOURCE_METRICS_TABLE-设置CREATE_DATE为服务器的时间戳。
通过过过滤行时间戳列进行查询时,除了执行Phoenix对行键列所做的常规优化外,Phoenix还能够适当地设置扫描上的最小和最大时间范围。在这个时间范围信息的帮助下,服务器端的HBase可以完全跳过那些不在时间范围内的存储文件。这极大地提高了性能,尤其是在查询数据的尾部时。
网友评论