零基础学Flink:实时热销榜Top5(案例)

文章讲述了如何使用ApacheFlink进行实时流处理,通过join、窗口操作、聚合和自定义ProcessFunction实现数据的聚合计算,并利用TopNHot函数计算每个窗口内商品的销售排名。过程中还提到了ListState的使用以保证状态一致性。
摘要由CSDN通过智能技术生成

joinedTimedStream.keyBy(new KeySelector<Tuple9<Long,String,Integer,String,Integer,Long,String,Integer,Integer>,String>(){

@Override

public String getKey(Tuple9<Long,String,Integer,String,Integer,Long,String,Integer,Integer> value) throws Exception {

return value.f1+value.f2;

}

}).timeWindow(Time.seconds(30), Time.seconds(10))

.aggregate(new SumAgg(), new WindowResultFunction());

这里我们再次引用这张图,来加深一下理解,stream是如何转换的。

640?wx_fmt=png

在这里,我们同时需要对数据进行聚合,这里我们不以订单计数来衡量热销商品,而是使用最终价格的聚合值来进行衡量。

接下来我们需要定义如何进行聚合计算,这里只做了简单聚合

public static class SumAgg implements AggregateFunction<Tuple9<Long,String,Integer,String,Integer,Long,String,Integer,Integer>, Long, Long> {

@Override

public Long createAccumulator() {

return 0L;

}

@Override

public Long add(Tuple9<Long,String,Integer,String,Integer,Long,String,Integer,Integer> value, Long acc) {

return acc + value.f8;

}

@Override

public Long getResult(Long acc) {

return acc;

}

@Override

public Long merge(Long acc1, Long acc2) {

return acc1 + acc2;

}

}

然后是定义输出窗口结果

/** 用于输出窗口的结果 */

//IN, OUT, KEY, W extends Window

public static class WindowResultFunction implements WindowFunction<Long, OrderView, String, TimeWindow> {

@Override

public void apply(

String key, // 窗口的主键

TimeWindow window, // 窗口

Iterable aggregateResult, // 聚合函数的结果

Collector collector // 输出类型为 OrderView

) throws Exception {

Long count = aggregateResult.iterator().next();

collector.collect(OrderView.of(key, window.getEnd(), count));

}

}

public static class OrderView {

public String itemId; // 商品ID

public long windowEnd; // 窗口结束时间戳

public long allsum; // 商品的点击量

public static OrderView of(String itemId, long windowEnd, long allsum) {

OrderView result = new OrderView();

result.itemId = itemId;

result.windowEnd = windowEnd;

result.allsum = allsum;

return result;

}

@Override

public String toString() {

return “OrderView{” +

“itemId='” + itemId + ‘\’’ +

“, windowEnd=” + windowEnd +

“, viewCount=” + allsum +

‘}’;

}

}

经过上述的步骤,我们得到了一个经过聚合的时间窗口数据,接下来只需取再按时间分组并取到前五的数据就大功告成了。使用 ProcessFunction 实现一个自定义的 TopN 函数 TopNHot 来计算排名前5的商品,并将排名结果格式化成字符串,便于后续输出。

DataStream topNHots = windowedData

.keyBy(“windowEnd”)

.process(new TopNHot(5));

ProcessFunction 是 Flink 提供的一个 low-level API,用于实现更高级的功能。它主要提供了定时器 timer 的功能(支持EventTime或ProcessingTime)。本案例中我们将利用 timer 来判断何时收齐了某个 window 下所有商品的点击量数据。由于 Watermark 的进度是全局的,在 <

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值