Apache Spark:如何通过限制结果来提高FP-Growth计算速度

时间:2016-07-26 14:19:21

标签: java performance apache-spark

最近我试图通过Apache Spark实现FP-Growth来评估数据。手头的数据基本上是购物车数据,包括客户和产品。 由于数据集非常复杂,frequencyItemsets的计算需要很长时间。所以我决定尝试通过放置最大值来过滤结果。 frequencyItemsets的长度如下:

//To do run FPGrowthTest 

FPGrowth fpg = new FPGrowth().setMinSupport(minSupport).setNumPartitions(12);

// run the model on the values which are the products for each custome
JavaRDD<Iterable<String>> groupByValues = groupsForProduct.values();

FPGrowthModel<String> model = fpg.run(groupByValues);

double minConfidence = 0.3;

JavaRDD<FreqItemset<String>> filteredmodel = model.freqItemsets().toJavaRDD()
      .filter(new Function<FreqItemset<String>, Boolean>(){
            public Boolean call(FreqItemset<String> fi){
                if (fi.javaItems().size() <= 5){
                    return true;}
                else {
                    return false;
                }
            }

        });


filteredmodel.map(new Function<FPGrowth.FreqItemset<String>, String>() {        
            @Override public String call(FPGrowth.FreqItemset<String> fi) {
                return fi.javaItems() + " -> " + fi.freq();
            }
        }).saveAsTextFile(
            <path>);

AssociationRules ar = new AssociationRules();
ar.setMinConfidence(minConfidence);
ar.run(filteredmodel).saveAsTextFile(<path>);

我试图逐个浏览数据产品,逐步减少FP-Growth算法的树大小。仍然是第一个产品,我的算法现在运行了一个小时,但仍然没有完成,我只是在一小部分数据样本上运行它。该程序甚至没有完成创建所有的frequencyItemsets的第一步,所以我甚至不会看到,如果AssociationRules结果看起来像我希望它们看起来那样。

有没有办法减少计算的树木化而不必过滤()整个数据?我做错了什么,我怎样才能提高速度?似乎没有限制frequencyItemset结果的函数。也许还有其他解决方案可以处理这些复杂的数据集吗?

TL / DR:有没有办法通过限制frequencyItemset结果来改进FP-Growth算法而不过滤所有数据?

1 个答案:

答案 0 :(得分:0)

是的,问题出在更麻烦的交易上(您提到的有很多项目)。所以我建议您删除那些,我遇到了同样的问题。平均入场券有5件物品,而我只有2笔交易有52或46件物品,使交易过程爆炸式增长。一旦删除它们,我就可以毫无问题地运行它。所以是的,删除异常值交易,您应该会很好。