如何理解Apache Flink中的Window机制

问题描述 投票:0回答:1

我正在学习如何使用Flink处理流数据。

据我所知,我可以多次使用函数map进行各种转换。

表示数据源一直向Flink发送字符串。所有字符串都是JSON格式的数据,如下所示:

{"name":"titi","age":18}
{"name":"toto","age":20}
...

这是我的代码:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
FlinkPravegaReader<String> source = FlinkPravegaReader.<String>builder()
    .withPravegaConfig(pravegaConfig)
    .forStream(stream)
    .withDeserializationSchema(new PravegaDeserializationSchema<>(String.class, new JavaSerializer<>()))
    .build();

// Convert String to Json Object
// MyJson is a POJO class, defined by me
DataStream<MyJson> jsonStream = env.addSource(source).name("Pravega Stream")
    .map(new MapFunction<String, MyJson>() {
    @Override
    public MyJson map(String s) throws Exception {
        MyJson myJson = JSON.parseObject(s, MyJson.class);
        return myJson;
        }
    });
// Convert MyJson Object to String and extract what I need
DataStream<String> valueInJson = jsonStream
    .map(new MapFunction<MyJson, String>() {
        @Override
        public String map(MyJson myJson) throws Exception {
            return myJson.getName().toString();
        }
    });
valueInJson.print();
env.execute("StreamingJob");

如您所见,我的示例非常简单:获取和反序列化数据--->将字符串转换为Json对象--->将Json对象转换为字符串,并得到我所需要的(这里我只需要name)。

目前,似乎一切正常。我确实从日志文件中获得了预期的输出。

但是,我知道Flink为我们提供了强大的功能:窗口。

我想知道如何在示例中使用此机制。

例如,如果我想用一些2秒的窗口分割数据流,该如何编码?

我已经尝试过这样:

DataStream<String> valueInJson = jsonStream
    .timeWindow(Time.seconds(2))
    .map(new MapFunction<MyJson, String>() {
        @Override
        public String map(MyJson myJson) throws Exception {
            return myJson.toString();
        }
    });
valueInJson.print();

但是,我遇到一个错误:

找不到符号 符号:方法 timeWindow(org.apache.flink.streaming.api.windowing.time.Time) 位置:类型的变量jsonStream org.apache.flink.streaming.api.datastream.DataStream

但是,我已经导入:

import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.streaming.api.windowing.time.Time;

为什么会出现此错误?我是否使用Windows错误?我想念了解Flink吗?

apache-flink flink-streaming
1个回答
0
投票

您有错误,因为timeWindow()功能是在KeyedStream中定义的,而不是在DataStream中定义的,因为它是基于键的操作。根据您的情况,将timeWindow()更改为timeWindowAll()就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.