我遇到了一个问题,我希望火花计数在时间窗口上收到的行数以及每个时间窗口结束时这些行的总字节数。
另一方面,我的代码只计算每一行而不是全局。有人能告诉我我的代码有什么问题吗?
{ userId: "16418256815618" }
答案 0 :(得分:0)
问题在于以下内容的第一个陈述:
words.window(windowDuration, slideDuration).foreachRDD...
words.countByWindow(windowDuration, slideDuration).print();
问题是你要重置每一行的字节总和值。这将为您提供问题中提到的单行中的字节数。
您可以使用以下内容替换上述两个语句来实现所需的功能:
//counts will have elements of the form (1, numberOfBytesInALine)
JavaPairDStream<Integer, Integer> counts = words.mapToPair(new PairFunction<String, Integer, Integer>() {
@Override
public Tuple2<Integer, Integer> call(final String line) {
return new Tuple2<Integer, Integer>(1, line.getBytes().length));
}
});
//countOfWindow will have single element of the form (totalNumberOfLines, totalNumberOfBytes)
JavaDStream<Tuple2<Integer, Integer>> countOfWindow = counts.reduceByWindow(new Function2<Tuple2<Integer, Integer>,Tuple2<Integer, Integer>, Tuple2<Integer, Integer>> () {
@Override
public Tuple2<Integer, Integer> call(final Tuple2<Integer, Integer> a , final Tuple2<Integer, Integer> b) {
return new Tuple2<Integer, Integer>(a._1 + b._1, a._2 + b._2));
}
}
,windowDuration,slideDuration);
countOfWindow.print();
诀窍是将每一行转换为整数1和该行中的字节数。之后,当我们减少它时,1s将总和为行数,另一方面,每行的字节数总和为总字节数。