我有一个问题我现在被困了两天。也许你们中的某些人可以帮助我。
我尝试将窗口的开始时间传递给用户定义的聚合。不幸的是我不知道该怎么做。我认为它的工作方式如下:
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用它来计算呢?
我非常感谢任何暗示。
乔
答案 0 :(得分:0)
您需要时间敏感的UDA。继承自CepTimeSensitiveAggregate(请参阅http://technet.microsoft.com/en-us/library/ee842915.aspx),您的生成输出方法将WindowDescriptor作为签名的一部分。作为奖励,您还可以获得事件的时间标题,因此您不需要将此信息作为有效负载的一部分排入队列。虽然有一些边缘用例需要这样,但在大多数情况下,您并不需要它。