如何在flink中对字符串数据流执行timewindow()?

aiqt4smr  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(434)

我想在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

如何对字符串数据执行时间窗口,或者如何将这些数据转换为元组?

xriantvc

xriantvc1#

你可以转换一个 DataStream[String] 变成一个 DataStream[(Int, String, Double)] 使用 MapFunction[String, (Int, String, Double)] 它将字符串解析为其组件,转换数据类型并发出 Tuple .
你也可以申请 timeWindowAll 在非键控数据流上。然而,语义当然是不同的,allwindow只能用parallelism 1处理。

相关问题