Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么不能从另一个Spark功能内部访问自动连接的Spark功能_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark 为什么不能从另一个Spark功能内部访问自动连接的Spark功能

Apache spark 为什么不能从另一个Spark功能内部访问自动连接的Spark功能,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我在另一个Spark函数f2中使用Spark filter函数f1(call()方法)。我正在自动连接函数对象f1。但这最终导致任务无法序列化。然后,当我将这个对象赋给另一个局部变量时,它工作正常。我不知道我在这里做错了什么,但它觉得我对此有一个误解 下面,我提供了工作和非工作代码 这是过滤器功能(f1): @Bean(name=“lengthFilter”) 公共函数lengthFilter(@Value(“${record.length:31}”)字符串recordLength){ 返回i-

我在另一个Spark函数f2中使用Spark filter函数f1(call()方法)。我正在自动连接函数对象f1。但这最终导致任务无法序列化。然后,当我将这个对象赋给另一个局部变量时,它工作正常。我不知道我在这里做错了什么,但它觉得我对此有一个误解

下面,我提供了工作和非工作代码

这是过滤器功能(f1):

@Bean(name=“lengthFilter”)
公共函数lengthFilter(@Value(“${record.length:31}”)字符串recordLength){
返回i->!Strings.isNullOrEmpty(i)和&i.length()==Integer.valueOf(recordLength);
}
非工作代码:

@Autowired
@Qualifier("lengthFilter")
private Function<String, Boolean> lengthFilter;

JavaDStream<String> records = messages.map(t -> t._2());


records.mapToPair(s -> {

        if(lengthFilter.call(s)) {
            return new Tuple2<>(s.substring(0,2), s);
        } else {
            return new Tuple2<>("default", s);
        }

    });
@Autowired
@限定符(“长度过滤器”)
专用函数长度过滤器;
JavaDStream records=messages.map(t->t._2());
记录。mapToPair(s->{
如果(lengthFilter.call){
返回新的Tuple2(s.substring(0,2),s);
}否则{
返回新的Tuple2(“默认值”,s);
}
});
此代码引发Spark异常,表示任务不可序列化

工作代码:

@Autowired
@Qualifier("lengthFilter")
private Function<String, Boolean> lengthFilter;


Function<String,Boolean> lengthFilterLocal = lengthFilter;

JavaDStream<String> records = messages.map(t -> t._2());


records.mapToPair(s -> {

    if(lengthFilterLocal.call(s)) {
        return new Tuple2<>(s.substring(0,2), s);
    } else {
        return new Tuple2<>("default", s);
    }

});
@Autowired
@限定符(“长度过滤器”)
专用函数长度过滤器;
函数lengthFilterLocal=lengthFilter;
JavaDStream records=messages.map(t->t._2());
记录。mapToPair(s->{
如果(lengthFilterLocal.call){
返回新的Tuple2(s.substring(0,2),s);
}否则{
返回新的Tuple2(“默认值”,s);
}
});
第一个失败,异常是任务无法序列化,而第二个成功执行。这两个代码之间的唯一区别在于,在第二个代码中,autowired函数被分配给一个局部变量,并且该变量是从mapToPair()内部访问的。我想知道这背后的原因是什么,或者我错在哪里

@Autowired
@Qualifier("lengthFilter")
private Function<String, Boolean> lengthFilter;


Function<String,Boolean> lengthFilterLocal = lengthFilter;

JavaDStream<String> records = messages.map(t -> t._2());


records.mapToPair(s -> {

    if(lengthFilterLocal.call(s)) {
        return new Tuple2<>(s.substring(0,2), s);
    } else {
        return new Tuple2<>("default", s);
    }

});