StreamInsight将窗口开始时间传递给UDA

时间:2014-05-13 14:32:43

标签: c# linq streaminsight

我有一个问题我现在被困了两天。也许你们中的某些人可以帮助我。

我尝试将窗口的开始时间传递给用户定义的聚合。不幸的是我不知道该怎么做。我认为它的工作方式如下:

var tot = from row in tumblingWin
          select new
          {
              value = row.UserDefinedAggregate<Dataclass, Total2, double>(new StartBoundsConfig
              {
                  Winstart = row.WinStart().Ticks                       
              }) * processinginterval,
          };

UDA看起来像这样:

public class Total2: CepAggregate<Dataclass,double>
{
    private Dataclass lastone; //keep it, if needed for next window
    private StartBoundsConfig _conf;

    public Total2(StartBoundsConfig config)
    {
        _conf = config;
    }

    public override double GenerateOutput(IEnumerable<Dataclass> events)
    {
       //TODO check if value on window start => if not use last from previous as starting value

       bool checkfirst = true;
       long result = 0;
       long tsone = 0;

       foreach (var evts in events)
       {
           if (checkfirst == true)
           {
               tsone = evts.Gentime.Ticks;
               checkfirst = false;
           }
           else
           {
               long tstwo = evts.Gentime.Ticks;
               long delta = tstwo - tsone;
               long value = (long) evts.Value;
               result += delta*value;
               tsone = tstwo;
           }

           lastone = evts;
       }

       return result;          
    }    
}

我试图将窗口开始传递给UDA的配置并从那里读取它。 有谁知道为什么这不起作用,我怎么能把窗口的开始时间传递给UDA用它来计算呢?

我非常感谢任何暗示。

1 个答案:

答案 0 :(得分:0)

您需要时间敏感的UDA。继承自CepTimeSensitiveAggregate(请参阅http://technet.microsoft.com/en-us/library/ee842915.aspx),您的生成输出方法将WindowDescriptor作为签名的一部分。作为奖励,您还可以获得事件的时间标题,因此您不需要将此信息作为有效负载的一部分排入队列。虽然有一些边缘用例需要这样,但在大多数情况下,您并不需要它。