updateStateByKey()之后的Apache Spark合并

时间:2016-05-29 10:14:01

标签: java apache-spark spark-streaming

我正在尝试合并两个流,其中一个应该是有状态的(比如没有频繁更新的静态数据):

SparkConf conf = new SparkConf().setAppName("Test Application").setMaster("local[*]");
JavaStreamingContext context = new JavaStreamingContext(conf, Durations.seconds(10));
context.checkpoint(".");
JavaDStream<String> dataStream = context.socketTextStream("localhost", 9998);
JavaDStream<String> refDataStream = context.socketTextStream("localhost", 9999);

JavaPairDStream<String, String> pairDataStream = dataStream.mapToPair(e -> {
    String[] tmp = e.split(" ");
    return new Tuple2<>(tmp[0], tmp[1]);
});

JavaPairDStream<String, String> pairRefDataStream = refDataStream.mapToPair(e -> {
    String[] tmp = e.split(" ");
    return new Tuple2<>(tmp[0], tmp[1]);
}).updateStateByKey((Function2<List<String>, Optional<String>, Optional<String>>) (strings, stringOptional) -> {
    if (!strings.isEmpty()) {
        return Optional.of(strings.get(0));
    }
    return Optional.absent();
});

pairDataStream.join(pairRefDataStream).print();


context.start();
context.awaitTermination();

当我将1 aaa写入第一个流并且1 111立即写入第二个流时,一切正常,我看到了合并的结果。但是,当我在一分钟后将1 bbb写入第一个流时,我什么都没看到。

我是否正确理解updateStateByKey()的作用?或者我错了?

1 个答案:

答案 0 :(得分:3)

updateStateByKey完全符合您的要求。特别是如果当前窗口不包含数据(strings.isEmpty()),则指示它忘记(返回Optional.absent();):

if (!strings.isEmpty()) {
    return Optional.of(strings.get(0));
}
return Optional.absent();

虽然你可能想要的是返回先前的状态:

if (!strings.isEmpty()) {
    return Optional.of(strings.get(0));
}
return stringOptional;