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
Java 如何通过避免ApacheSpark中的flatmap操作来提高性能_Java_Apache Spark_Apache Spark Dataset - Fatal编程技术网

Java 如何通过避免ApacheSpark中的flatmap操作来提高性能

Java 如何通过避免ApacheSpark中的flatmap操作来提高性能,java,apache-spark,apache-spark-dataset,Java,Apache Spark,Apache Spark Dataset,我正在针对我的java itemObjects运行一组规则。对于每个项目,我都在处理规则列表 通常我有100万件物品和100条规则 目前在spark中运行此程序需要15分钟 我观察到,faltmatoppair需要更多的时间。我想提高这个程序的性能 Get the rules map each item against the list of rules and produce result set return JavaPairRDD of itemId and List<RuleRes

我正在针对我的java itemObjects运行一组规则。对于每个项目,我都在处理规则列表

通常我有100万件物品和100条规则

目前在spark中运行此程序需要15分钟

我观察到,
faltmatoppair
需要更多的时间。我想提高这个程序的性能

Get the rules
map each item against the list of rules and produce result set
return JavaPairRDD of itemId and List<RuleResult>
获取规则
根据规则列表映射每个项并生成结果集
返回itemId和List的javapairdd
有没有关于重构此代码以进一步提高性能的建议

我已经编写了以下代码

public JavaPairRDD<String, List<RuleResult>> validate() {       
        List<ExecutableRule<T>> rules = ruleWrapper.getRulesList().collect();
        JavaPairRDD<String, List<RuleResult>> resultsPairRDD = itemsForValidation
                .map(x -> getRulesResult(rules, x))
                .flatMapToPair(this::mapToRuleResultById)
                .aggregateByKey(
                        MapperUtil.<RuleResult>newList(),
                        MapperUtil::addToList,
                        MapperUtil::combineLists
                );      
        return resultsPairRDD;
    }

    private List<Tuple2<String, RuleResult>> mapToRuleResultById(List<RuleResult> ruleResults) {
        return ruleResults.stream()
                .map(ruleResult -> new Tuple2<>(ruleResult.getItemId(), ruleResult))
                .collect(toList());
    }

    private List<RuleResult> getRulesResult(List<ExecutableRule<T>> rules, T x) {
        return rules.stream()
                .map(rule -> rule.execute(x)).collect(toList());
    }

    public  RuleResult execute(T t){
    //get the rule result
    }

    public class RuleResult{
        private String itemId;
    }
public javapairdd validate(){
列表规则=ruleWrapper.getRulesList().collect();
JavaPairRDD resultsPairRDD=项目保存
.map(x->getRulesResult(规则,x))
.flatMapToPair(this::mapToRuleResultById)
.艾比(
MapperUtil.newList(),
MapperUtil::addToList,
MapperUtil::组合列表
);      
返回结果pairdd;
}
私有列表映射器RuleResultById(列表规则结果){
返回ruleResults.stream()
.map(ruleResult->new Tuple2(ruleResult.getItemId(),ruleResult))
.collect(toList());
}
私有列表getRulesResult(列表规则,T x){
返回规则.stream()
.map(rule->rule.execute(x)).collect(toList());
}
公共规则结果执行(T){
//获得规则结果
}
公共类规则结果{
私有字符串itemId;
}

也许我误解了什么,但我认为没有必要使用
平面图或
聚合键

public JavaPairRDD<String, List<RuleResult>> validate() {       
    List<ExecutableRule<T>> rules = ruleWrapper.getRulesList().collect();
    JavaPairRDD<String, List<RuleResult>> resultsPairRDD = itemsForValidation
            .map(x -> new Tuple2<>(x, getRulesResult(rules, x)));
    return resultsPairRDD;
}
public javapairdd validate(){
列表规则=ruleWrapper.getRulesList().collect();
JavaPairRDD resultsPairRDD=项目保存
.map(x->new Tuple2(x,getRulesResult(rules,x)));
返回结果pairdd;
}

那不行吗?

谢谢你的回答。需要flatmap,因为稍后我将准备与Ruleresult中的字段进行配对。每个规则结果都有itemid,对于一个itemid,可以有多个ruleresults。