【Storm】Trident 各类操作的输出

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相同)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值