如何在Flink的String DataStream上执行timeWindow()?

时间:2016-04-18 14:05:46

标签: apache-flink flink-streaming

我想在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()这个DataStream。我可以通过卷号(第一列,例如Mokshda的52)来键入它。

val windowedStream = stockStream
                        .keyBy(0)
                        .timeWindow(Time.seconds(20))
                        .sum(2)

但显然,Flink并没有将我的数据作为列表读取。它将它作为String读取,因此,我得到以下异常:

Exception in thread "main" org.apache.flink.api.common.InvalidProgramException: Specifying keys via field positions is only valid for tuple data types. Type: String

如何在字符串数据上执行timeWindow,或者如何将此数据转换为元组?

1 个答案:

答案 0 :(得分:5)

您可以使用DataStream[String]DataStream[(Int, String, Double)]转换为MapFunction[String, (Int, String, Double)]Tuple将字符串解析为其组件,转换数据类型并发出timeWindowAll

您还可以在非键控数据流上应用Posts。但是,语义当然是不同的,AllWindow只能用并行性处理1.