Spark实现Apriori算法,Apriori算法如果支持度高那么效果会很好,如果支持度设置的低,性能会比较差。
1:createNewItemsetsFromPreviousOnes需要优化,没有想清楚。
2:结果没有转换正确的ID,API可以优化成泛型。
3:原理不复杂,代码看看就全懂了。
代码
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import scala.Tuple2;
/**
*
*/
public class SparkApriori implements Serializable
{
private static final Pattern SPACE = Pattern.compile( "\\s+" );
private double minSupport;
private int itemsetNumber;
public SparkApriori( double minSupport )
{
super( );
this.minSupport = minSupport;
}
public void run( JavaRDD<String> data )
{
final long count = data.count( );
JavaPairRDD<String, Long> pairs = data.flatMap( s ->
{
List<Tuple2<String, Long>> list = new ArrayList<Tuple2<String, Long>>( );
String[] strs = SPACE.split( s );
// return new Tuple2<String, Long>(str);
for ( String str : strs )
{
list.add( new Tuple2<String, Long>( str, 1L ) );
}
return list;
} ).mapToPair( s -> s ).aggregateByKey( 0L, ( s1, s2 ) -> s1 + s2, ( s1,
s2 ) -> s1 +