1、函数
package trident.function;
import backtype.storm.tuple.Values;
import storm.trident.operation.BaseFunction;
import storm.trident.operation.TridentCollector;
import storm.trident.tuple.TridentTuple;
public class AddAndMultiply extends BaseFunction{
@Override
public void execute(TridentTuple tuple, TridentCollector collector) {
int i1 = tuple.getInteger(0);
int i2 = tuple.getInteger(1);
collector.emit(new Values(i1 + i2, i1 * i2));
}
}
输出的功能字段都被添加到输出tuple中。因此每一个tuple中将会有5个字段, "x", "y", "added", "multiplyied";其中"added" 和 "multiplyied" 分别对应于AddAndMultiply输出的第一和第二个字段;
stream.each(new Fields("x", "y"), new AddAndMultiply(), new Fields("added", "multiplyied"));
2、聚合
Trident有aggregate和persistentAggregate函数对流做聚合,aggregate在每个批次上独立运行,persistentAggregate聚合流的所有批次并将结果存储下来;
在一个流上做全局的聚合,可以使用reducerAggregator或者aggregator,这个流先被分成一个小区,然后聚合函数在这个分区上运行;如果使用CombinerAggregator,Trident先在每个分区上做一个局部的汇总,然后重分区为一个分区,在网络传输结束后完成聚合;
stream.aggregate(new Fields("val2"), new Sum(), new Fields("sum"))
out stream将会只包含一个叫做 "sum" 的字段,这个 sum 字段就是 "val2" 的累积和;
3、Group By
在group之后的stream上,输出将会是被group的字段以及聚合器输出的字段,如:
stream.groupBy(new Fields("val1")).aggregate(new Fields("val2"), new Sum(), new Fields("sum"))
在这个例子中,输出将包含"val1"和"sum"
GroupBy操作根据特殊的字段对流进行重分区,分组字段相同的元组(tuple)被分到同一个分区。如果对分组的流进行聚合,聚合会对每个组聚合而不是这个批次聚合。(和关系型数据库的groupby相同)。