我对我的java itemObjects有一套规则。对于每个项目,我正在处理规则列表。
通常我有100万个项目和100条规则。
目前,在spark中运行此程序需要15分钟。
我发现faltMaptopair
需要更多时间。我想提高该程序的性能。
Get the rules
map each item against the list of rules and produce result set
return JavaPairRDD of itemId and List<RuleResult>
有关重构此代码以进一步提高性能的任何建议
我写了下面的代码。
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;
}
最佳答案
也许我误会了一些东西,但是我看不到既不需要flatMap
也不需要aggregateByKey
。
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;
}
那行不通吗?
关于java - 如何通过避免Apache Spark中的平面图操作来提高性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47805686/