我想在apache flink中创建一个流数据的时间窗口。我的数据看起来有点像这样:
1> {52,"mokshda",84.85}
2> {1,"kavita",26.16}
2> {131,"nidhi",178.9}
3> {2,"poorvi",22.97}
4> {115,"saheba",110.41}
每隔20秒,我需要所有行的分数之和(最后一列,例如mokshda的分数是84.85)。timewindow()函数对keyedstream进行操作,因此我必须对这个数据流执行keyby()。我可以按卷号键(第一列,例如52代表mokshda)。
val windowedStream = stockStream
.keyBy(0)
.timeWindow(Time.seconds(20))
.sum(2)
但很明显,Flink并不是把我的数据当作一个列表来阅读的。它将它作为字符串读取,因此,我得到以下异常:
Exception in thread "main" org.apache.flink.api.common.InvalidProgramException: Specifying keys via field positions is only valid for tuple data types. Type: String
如何对字符串数据执行时间窗口,或者如何将这些数据转换为元组?
1条答案
按热度按时间xriantvc1#
你可以转换一个
DataStream[String]
变成一个DataStream[(Int, String, Double)]
使用MapFunction[String, (Int, String, Double)]
它将字符串解析为其组件,转换数据类型并发出Tuple
.你也可以申请
timeWindowAll
在非键控数据流上。然而,语义当然是不同的,allwindow只能用parallelism 1处理。