Java 如何通过避免ApacheSpark中的flatmap操作来提高性能
我正在针对我的java itemObjects运行一组规则。对于每个项目,我都在处理规则列表 通常我有100万件物品和100条规则 目前在spark中运行此程序需要15分钟 我观察到,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
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。