Java 不同元素的spark流式处理和批处理模式之间的代码重用

Java 不同元素的spark流式处理和批处理模式之间的代码重用,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,我是Spark新手,我想使用Spark流和Spark批处理实现一个lambda体系结构 我在网上找到了以下文章: 这对于我的一些分析来说是好的,但我认为在必须找到不同元素的情况下,这个解决方案是不可行的 如果要在JavaRDD上查找不同的元素,可以使用distinct方法。 数据流是RDD的集合,因此如果应用 transform((rdd) -> rdd.distinct()) 方法在数据流上,您将在流的每个rdd上执行distinct,因此您将在每个rdd中找到不同的元素,而不是在

我是Spark新手,我想使用Spark流和Spark批处理实现一个lambda体系结构

我在网上找到了以下文章:

这对于我的一些分析来说是好的,但我认为在必须找到不同元素的情况下,这个解决方案是不可行的

如果要在JavaRDD上查找不同的元素,可以使用distinct方法。 数据流是RDD的集合,因此如果应用

transform((rdd) -> rdd.distinct()) 
方法在数据流上,您将在流的每个rdd上执行distinct,因此您将在每个rdd中找到不同的元素,而不是在整个数据流上

可能这样写有点混乱,所以让我用一个例子来澄清:

我有以下几点:

Apple
Pear
Banana
Peach
Apple
Pear
在批处理应用程序中:

JavaRDD<String> elemsRDD=sc.textFile(exFilePath).distinct() 
如果我理解正确,这应该是流的行为:

假设批处理时间为1s,窗口为2s:

第一个RDD:

Apple  
Pear
Banana
第二个RDD:

Peach
Apple
Pear

JavaDStream<String> elemsStream=(getting from whathever source)
childStream = elemsStream.transform((rdd) -> rdd.distinct())
childStream.forEachRDD...
第二:

Peach
Apple
Pear
与RDD不同,但与数据流不同

我的流媒体部分解决方案如下:

JavaDStream<HashSet<String>> distinctElems = elemsStream.map(
                (elem) -> {
                    HashSet<String> htSet = new HashSet<String>();
                    htSet.add(elem);
                    return htSet;
                }).reduce((sp1, sp2) -> {
                    sp1.addAll(sp2);
                    return sp1;
                });
作为批处理模式。 但是,此解决方案将需要维护开销,并且有因重复代码库而导致错误的风险

是否有更好的方法来达到相同的结果,尽可能多地重用批处理模式的代码


提前感谢。

您的解决方案非常优雅

我有其他的解决方案,它不如你的优雅,但我不知道它是否更有效。这是我基于mapToPairFunction的解决方案

JavaPairDStream<String, Integer> distinctElems = elemsStream
       .mapToPair(event -> new Tuple2<String, Integer>(event,1));
distinctElems = distinctElems.reduceByKey((t1, t2) -> t1);
JavaPairDStream distinctElems=elemstream
.mapToPair(事件->新元组2(事件,1));
distinctElems=distinctElems.reduceByKey((t1,t2)->t1);

我认为这是更有效的,但我不能测试它

你可以试试UpdateStateByKey。。
JavaDStream<HashSet<String>> distinctElems = elemsStream.map(
                (elem) -> {
                    HashSet<String> htSet = new HashSet<String>();
                    htSet.add(elem);
                    return htSet;
                }).reduce((sp1, sp2) -> {
                    sp1.addAll(sp2);
                    return sp1;
                });
Apple
Pear
Banana
Peach
JavaPairDStream<String, Integer> distinctElems = elemsStream
       .mapToPair(event -> new Tuple2<String, Integer>(event,1));
distinctElems = distinctElems.reduceByKey((t1, t2) -> t1);