如何对Flink中的字符串数据流执行timeWindow()?


0

我想在apacheflink中创建一个流数据的时间窗口。我的数据看起来有点像这样:

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()操作。我可以按卷号(第一列,例如Mokshda的52)来输入。

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

如何对字符串数据执行时间窗口,或者如何将此数据 transformation为元组?

1 答案


0

您可以使用MapFunction[String,(Int,String,Double)]将数据流[String] transformation为DataStream[(Int,String,Double)],该函数将字符串解析为其组件, transformation数据类型并发出元组。

也可以对非 key控数据流应用timeWindowAll。但是,语义当然不同,AllWindow只能用parallelishm1处理。


我来回答

写文章

提问题

面试题