collect的功能是什么?其底层如何实现的?_Flink实战:全局TopN分析与实现

本文详细介绍了Flink全局TopN的实现方法,通过ProcessFunction、State和定时器完成销售额统计、区域TopN计算及定时输出。核心逻辑包括:按区域+商品分组累加销售额、使用TreeSet和MapState进行TopN计算以及设置定时器输出TopN结果。最后,讨论了状态内存管理和测试案例。
摘要由CSDN通过智能技术生成

点击蓝字

fe099200eb7a4f7e9ca27a02f633c532.png

关注~~

在上一篇Flink实战: 窗口TopN分析与实现中实现了在一个窗口内的分组topN,但是在实际中也会遇到没有窗口期的topN,例如在一些实时大屏监控展示中,展示历史到现在所有的TopN数据,将这个称之为全局topN,仍然以计算区域维度销售额topN的商品为例,看一下全局TopN的实现方法。先将需求分解为以下几步:

  • 按照区域areaId+商品gdsId分组,计算每个分组的累计销售额

  • 将得到的区域areaId+商品gdsId维度的销售额按照区域areaId分组,然后求得TopN的销售额商品,并且定时更新输出

与窗口TopN不同,全局TopN没有时间窗口的概念,也就没有时间的概念,因此使用ProcessingTime语义即可,并且也不能再使用Window算子来操作,但是在这个过程中需要完成数据累加操作与定时输出功能,选择ProcessFunction函数来完成,使用State保存中间结果数据,保证数据一致性语义,使用定时器来完成定时输出功能。

销售额统计

对数据流按照区域areaId+商品gdsId分组,不断累加销售额保存起来,然后输出到下游。

val env =StreamExecutionEnvironment.getExecutionEnvironment

env.setParallelism(1)

val kafkaConfig =newProperties();

kafkaConfig.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");

kafkaConfig.put(ConsumerConfig.GROUP_ID_CONFIG,"test1");

val consumer =newFlinkKafkaConsumer011[String]("topic1",newSimpleStringSchema(), kafkaConfig)

val orderStream = env.addSource(consumer)

.map(x =>{

val a = x.split(",")

Order(a(0), a(1).toLong, a(2), a(3).toDouble, a(4))

})

val salesStream=orderStream.keyBy(x =>{

x.areaId +"_"+ x.gdsId

}).process(newKeyedProcessFunction[String,Order,GdsSales](){

var orderState:ValueState[Double]= _

var orderStateDesc:ValueStateDescriptor[Double]= _

override def open(parameters:Configuration):Unit={

orderStateDesc =newValueStateDescriptor[Double]("order-state",TypeInformation.of(classOf[Double]))

orderState = getRuntimeContext.getState(orderStateDesc)

}

override def processElement

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值