第1关:设置时间窗口并进行计算
相关知识
为了完成本关任务,你需要掌握:如何设置时间窗口并进行计算。
设置时间窗口并计算
Flink 对数据的时间计算一般要设置时间窗口,然后对时间窗口中的数据进行计算。
常见的时间窗口分为滚动窗口和滑动窗口。
滚动窗口会将数据按固定时间段分为各个时间窗口,比如固定时间段为10分钟,那一小时的数据就会被分为6个时间窗口,每个时间窗口10分钟。
滑动窗口会每隔一段时间,计算之前某个时间段的数据,比如每隔3分钟,计算之前一个小时的数据。
详细应用参见代码。
编程要求
根据提示,在右侧编辑器补充代码,设置时间窗口并进行计算,输出结果,
要求对其中的数据按每 20 分钟为一个时间窗口,对其中的浏览商品行为(即行为类型为 pv)进行时间戳最大值的计算,并输出结果,
如以下数据:
543462,1715,1464116,pv,1511658000
662867,2244074,1575622,pv,1511658000
750784,4727562,1286537,cart,1511658009
23125,4680673,1756314,buy,1511658009
44670,5140156,2131531,fav,1511658010
348706,1715,4163659,pv,1511658012
959846,2244074,479837,pv,1511658012
848070,1715,2342116,pv,1511658012
750785,4727562,1286537,cart,1511658001
数据格式如下表:
用户id | 商品id | 商品类目id | 行为类型 | 时间戳 |
---|---|---|---|---|
543462 | 1715 | 1464116 | pv | 1511658000 |
以逗号进行分隔。
import org.apache.flink.api.java.io.TextInputFormat
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
//输入数据的样例类
case class UserBehavior( userId: Long, itemId: Long, categoryId: Int, behavior: String, timestamp: Long )
object Test1 {
def main(args: Array[String]): Unit = {
//flink的流执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//设定Time类型为EventTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//并发为1
env.setParallelism(1)
//获得数据源的文件
val stream = env.readFile[String](
new TextInputFormat(null),
"/data/workspace/myshixun/pflinkhotitems3_1/src/UserBehavior1.csv")
//获得文件中的每一行记录
val stream1 = stream
.map(line => {
val linearray = line.split(",")
UserBehavior(linearray(0).toLong, linearray(1).toLong, linearray(2).toInt, linearray(3), linearray(4).toLong)
})
//********** Begin **********
.assignAscendingTimestamps(_.timestamp * 1000)
.filter(_.behavior == "pv")
.keyBy("itemId")
.timeWindow(Time.minutes(20))
.max(4)
//********** End **********
stream1.writeAsText("/root/files/result.txt").setParallelism(1)
env.execute("设置时间窗口并进行计算")
}
}