目录
4.2.3 aggregate(AggregateFunction,WindowFunction)的使用
1.知识点
- scala样例类
- flink读文件
- assignAscendingTimestamps水位线
- KeyedProcessFunction<K, I, O>使用
- flink状态编程之键控状态

- flink定时器的创建
ctx.timerService().registerProcessingTimeTimer(ts)
- flink定时器的触发操作,一般可以对状态进行清空
override def onTimer(timestamp: Long, ctx: KeyedProcessFunction[(Long, Long), AdClickLog, AdClickLog]#OnTimerContext, out: Collector[AdClickLog]): Unit = {
if (timestamp == resetTimerTsState.value()){
isBlackState.clear()
countState.clear()
}
}
- flink侧输出流OutPutTag的使用
ctx.output(new OutputTag[BlackListUserWarning]("warning"),BlackListUserWarning(value.userId, value.adId, "Click ad over " + maxCount + " times today."))
- aggregate方法的使用,预聚合中间结果(可以与processWindowFunction做比较)
- aggregate输入(AggregateFunction , WindowFunction ) 预聚合在进行窗口内操作。
@PublicEvolving
def aggregate[ACC: TypeInformation, V: TypeInformation, R: TypeInformation](
preAggregator: AggregateFunction[T, ACC, V],
windowFunction: WindowFunction[V, R, K, W]): DataStream[R] = {
2.业务目标
- 页面广告点击量统计:每5s钟统计前一个小时的某个省份的广告点击总量
窗口:1个小时
步长:5s
维度:省份
指标:点击总量
输出格式:
count result> AdClickCountByProvince(2017-11-26 11:01:30.0,beijing,11)
count result> AdClickCountByProvince(2017-11-26 11:01:30.0,zhejiang,2)
count result> AdClickCountByProvince(2017-11-26 11:01:30.0,henan,1)
count result> AdClickCountByProvince(2017-11-26 11:01:35.0,beijing,6)
count result> AdClickCountByProvince(2017-11-26 11:01:40.0,beijing,1)
- 黑名单过滤:对当日点击某个adid大于某个值(如20000)的用户id拉入黑名单,并过滤
3.流程心法
- 定义输入输出样例类,定义黑名单样例类
- 主object
1)创建执行环境,设置事件时间语义,设置并行度
2)从文件中读取数据
3)转换成样例类并设置assignAscendingTimestamps自增水位线
4) 定义黑名单过滤KeyedProcessFunction
5)开窗聚合统计,以province为keyBy,用aggregate或者ProcessWindowFunction。
6)侧输出流获取并打印
4.模块详解
4.1 定义输入输出样例类,定义黑名单样例类
输入-广告点击日志:用户id、广告id、省份、城市、时间戳
输出-按省份统计的点击:窗口结束时间、省份、点击量
输出-黑名单报警:用户id、广告id、报警消息
// 定义输入输出样例类
case class AdClickLog(userId: Long, adId: Long, province: String, city: String, timestamp: Long)
case class AdClickCountByProvince(windowEnd: String, province: String, count: Long)
// 侧输出流黑名单报警信息样例类
case class BlackListUserWarning(userId: Long, adId: Long, msg: String)

该博客详细介绍了使用Apache Flink进行广告点击量统计和黑名单过滤的实现过程。通过创建执行环境,读取广告点击日志,转换样例类并设置水位线,利用KeyedProcessFunction实现黑名单过滤,以及aggregate方法进行窗口聚合统计。同时,展示了如何通过侧输出流捕获黑名单报警信息,并给出了具体代码实现。
最低0.47元/天 解锁文章
975





