在 Spark Streaming 应用程序中,如何在lines.foreachRDD() block 执行完成后执行lines.map() 函数。我提供了一个我想要的最小示例:
public class Stackoverflow implements Serializable {
public static List<DummyClass> list = null;
public void init(String str) throws Exception {
if (list == null) {
synchronized (Stackoverflow.class) {
if (list == null) {
list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add(new DummyClass());
}
}
}
}
}
public JavaDStream<DataTuple> initFunction(JavaDStream<DataTuple> lines, final String str) throws Exception {
lines.foreachRDD(
new VoidFunction<JavaRDD<DataTuple>>() {
@Override
public void call(JavaRDD<DataTuple> dataTupleJavaRDD) throws Exception {
init(str);
}
}
);
lines.map(new FinalTransformation(list));
return lines;
}
}
我希望lines.map()部分代码在其上面的部分之后执行,以便列表在执行时不为空。
最佳答案
不要运行 foreachrdd,而是运行一个映射,将输入更改为您想要的字符串和另一个映射。 Foreachrdd 并不是用于 rdd 的转换,这才是 map 的用途。
input.map(init).map(whatever)
关于java - 在Spark Streaming应用程序中,如何在一行lines.foreachRDD()完成执行后执行lines.map()函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404390/