在Cassandra中计算和计算平均值的高效查询

时间:2016-11-11 17:28:26

标签: php cassandra

我有一个表datavalue,每个client的数据差不多一年,时间间隔eventtime为15分钟。我想创建另一个表datavalue_by_hour,我将以1小时为间隔存储来自datavalue的数据。为此,我需要:

  1. 获取clienteventhour;
  2. 的不同值
  3. 为上述结果的每一行计算avg(activepower)client的{​​{1}};
  4. 计算上述平均函数中使用的eventhour值的数量。
  5. 问题是,在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

1 个答案:

答案 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