我有一个表datavalue
,每个client
的数据差不多一年,时间间隔eventtime
为15分钟。我想创建另一个表datavalue_by_hour
,我将以1小时为间隔存储来自datavalue
的数据。为此,我需要:
client
和eventhour
; avg(activepower)
和client
的{{1}}; eventhour
值的数量。问题是,在mysql或postgres中,这可以通过几乎一条指令轻松完成。使用Cassandra我想唯一的方法是循环遍历每个结果并应用另一个查询,直到最终结果实现。?这看起来效率很低,有没有其他方法以更有效的方式实现这样的结构?
activepower
我的初始数据值表具有以下结构:
AFH0AEE00A0BHC 2016-05-24 18:00:00+0000 0.067 4
AFH0AEE00AGCEC 2016-05-24 19:00:00+0000 0.081 4
AFH0ADE0ACDAAE 2016-05-24 20:00:00+0000 0.068 3
AFH0AEE00AGFEC 2016-05-24 21:00:00+0000 0.032 4
CREATE TABLE datavalue (
client text,
eventhour bigint,
eventtime timestamp,
activepower double,
activepowerclassification double,
dstoffset double,
PRIMARY KEY (( pt, eventhour ), eventtime));
表中的数据集示例(+10000000行):
datavalue
答案 0 :(得分:1)
更新您的架构添加dstCount,dstSum和dstAvg:
CREATE TABLE datavalue (
client text,
eventhour bigint,
eventtime timestamp,
activepower double,
activepowerclassification double,
dstoffset double,
powerCount bigint static,
powerSum double static,
powerAvg double static,
PRIMARY KEY (( client, eventhour ), eventtime));
我使用的是静态列,这里是doc
静态列是由同一分区的所有行共享的特殊列。让我们举个例子:假设我们想要存储需要支付的每用户账单,并保留每用户余额的剩余金额。我们想要维持的不变量是余额总是所有未付帐单的总和:
在插入新记录之前,请使用此查询为特定客户端和eventhour选择当前powerCount和powerSum
让你插入记录
client eventhour eventtime activepower
AFH0AEE00BFEFB 1473847200 2016-09-14 10:00:00+0000 0.040
查询将是
SELECT powerCount,powerSum
FROM datavalue
WHERE client = 'AFH0AEE00BFEFB' AND eventhour = 1473847200 LIMIT 1;
现在您获得当前的powerCount和powerSum
让powerCount = 4 and powerSum = 0.275
如此更新的数据
powerSum = powerSum + 0.040 = 0.315
powerCount = powerCount + 1 = 5
powerAvg = powerSum/powerCount = 0.063
现在插入记录以及新的powerSum,powerCount和powerAvg