Twitter Apache Flink:未触发流连接窗口

Twitter Apache Flink:未触发流连接窗口,twitter,apache-flink,flink-streaming,Twitter,Apache Flink,Flink Streaming,我试图在ApacheFlink中加入两个流以获得一些结果 我的项目的当前状态是,我正在获取twitter数据并将其映射到一个2元组中,在这个2元组中保存用户的语言和定义的时间窗口中的tweet总和。 我这样做是为了每种语言的推文数量和每种语言的转发次数。tweet/retweet聚合在其他进程中工作良好 我现在想得到一个时间窗口中转发的数量占所有推文数量的百分比 因此,我使用以下代码: Time windowSize = Time.seconds(15); // Sum up tweets p

我试图在ApacheFlink中加入两个流以获得一些结果

我的项目的当前状态是,我正在获取twitter数据并将其映射到一个2元组中,在这个2元组中保存用户的语言和定义的时间窗口中的tweet总和。 我这样做是为了每种语言的推文数量和每种语言的转发次数。tweet/retweet聚合在其他进程中工作良好

我现在想得到一个时间窗口中转发的数量占所有推文数量的百分比

因此,我使用以下代码:

Time windowSize = Time.seconds(15);

// Sum up tweets per language
DataStream<Tuple2<String, Integer>> tweetsLangSum = tweets
        .flatMap(new TweetLangFlatMap())
        .keyBy(0)
        .timeWindow(windowSize)
        .sum(1);

// ---

// Get retweets out of all tweets per language
DataStream<Tuple2<String, Integer>> retweetsLangMap = tweets
        .keyBy(new KeyByTweetPostId())
        .flatMap(new RetweetLangFlatMap());

// Sum up retweets per language
DataStream<Tuple2<String, Integer>> retweetsLangSum = retweetsLangMap
        .keyBy(0)
        .timeWindow(windowSize)
        .sum(1);

// ---

tweetsLangSum.join(retweetsLangSum)
            .where(new KeySelector<Tuple2<String, Integer>, String>() {
                @Override
                public String getKey(Tuple2<String, Integer> tweet) throws Exception {
                    return tweet.f0;
                }
            })
            .equalTo(new KeySelector<Tuple2<String, Integer>, String>() {
                @Override
                public String getKey(Tuple2<String, Integer> tweet) throws Exception {
                    return tweet.f0;
                }
            })
            .window(TumblingEventTimeWindows.of(windowSize))
            .apply(new JoinFunction<Tuple2<String, Integer>, Tuple2<String, Integer>, Tuple4<String, Integer, Integer, Double>>() {
                @Override
                public Tuple4<String, Integer, Integer, Double> join(Tuple2<String, Integer> in1, Tuple2<String, Integer> in2) throws Exception {
                    String lang = in1.f0;
                    Double percentage = (double) in1.f1 / in2.f1;
                    return new Tuple4<>(in1.f0, in1.f1, in2.f1, percentage);
                }
            })
            .print();
Time windowSize=Time.seconds(15);
//总结每种语言的推文
DataStream tweetslandsum=tweets
.flatMap(新的TweetLangFlatMap())
.keyBy(0)
.timeWindow(窗口大小)
.总数(1);
// ---
//从每种语言的所有推文中获取转发
DataStream retweetsLangMap=推文
.keyBy(新的KeyByTweetPostId())
.flatMap(新的RetweetLangFlatMap());
//总结每种语言的转发
DataStream retweetsLangSum=retweetsLangMap
.keyBy(0)
.timeWindow(窗口大小)
.总数(1);
// ---
tweetsLangSum.join(retweetsLangSum)
.where(新密钥选择器(){
@凌驾
公共字符串getKey(Tuple2 tweet)引发异常{
返回tweet.f0;
}
})
.equalTo(新的键选择器(){
@凌驾
公共字符串getKey(Tuple2 tweet)引发异常{
返回tweet.f0;
}
})
.window(TumblingEventTimeWindows.of(windowSize))
.apply(新函数(){
@凌驾
公共tuple4join(tuple2in1,tuple2in2)抛出异常{
字符串lang=in1.f0;
双百分比=(双)in1.f1/in2.f1;
返回新的Tuple4(in1.f0、in1.f1、in2.f1,百分比);
}
})
.print();

当我打印
tweetsLangSum
retweetsLangSum
时,输出似乎很好。我的问题是我从未从连接中获得输出。有人知道为什么吗?或者我在聚合的第一步中使用的窗口函数在连接时出错了吗?

这可能是由不同时间语义的混合造成的。
KeyedStream.timeWindow()
方法是一种快捷方式,它基于配置的时间特征创建窗口操作符,即,如果启用了事件时间,则创建事件时间窗口,否则创建处理时间窗口。对于联接,可以显式定义事件时间窗口

是否启用了事件时间处理

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

抱歉,响应迟了,但是
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)尚未启用,并对联接执行此操作。在加入之前,我仍然必须在流中调用
KeyedStream.timeWindow()
,以获得相同的数据“范围”来查看。非常感谢!调用
KeyedStream.timeWindow()
是完全可以的,但是您应该知道它的行为取决于配置的时间特性。您也可以调用
KeyedStream.window(tumblingeventimewindows.of(windowSize))
以获得更明确的代码。好的,我想我已经理解了其中的细微差别,非常感谢!