Flink实战: 窗口TopN分析与实现

点击上方蓝

字关注~

      

TopN 的需求场景不管是在离线计算还是实时计算都是比较常见的,例如电商中计算热门销售商品、广告计算中点击数前N的广告、搜索中计算搜索次数前N的搜索词。topN又分为全局topN、分组topN, 比喻说热门销售商品可以直接按照各个商品的销售总额排序,也可以先按照地域分组然后对各个地域下各个商品的销售总额排序。本篇以热门销售商品为例,实时统计每10min内各个地域维度下销售额top10的商品。

这个需求可以分解为以下几个步骤:

  • 提取数据中订单时间为事件时间

  • 按照区域+商品为维度,统计每个10min中的销售额

  • 按照区域为维度,统计该区域的top10 销售额的商品

时间提取

数据源类型是Kafka, 数据为订单数据包含:订单id、订单时间、商品id、区域id、订单金额(包含用户Id在这里省略)


   
   
   
  1. case class Order(orderId: String, orderTime: Long, gdsId: String, amount: Double, areaId: String)

我们这里统计的每10min内的数据,希望按照真实的订单时间统计,那么使用事件时间EventTime,考虑到可能存在数据乱序问题,允许最大延时为30s


   
   
   
  1. val orderStream=ds.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[Order](Time.seconds(30)) {

  2. override def extractTimestamp(element: Order): Long = element.orderTime

  3. })

统计销售额

统计每10min中的销售额,例如[9:00,9:10]、[9:10,9:20] 等等,对应Flink中事件时间滚动滚动窗口


   
   
   
  1. val amountStream=dataStream.keyBy(x => {

  2. x.areaId + "_" + x.gdsId

  3. }).timeWindow(Time.minutes(10))

  4. .reduc

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值