计算频繁项集是经典的数据挖掘算法,著名的啤酒和尿布现象就是频繁项集算法的典型应用。
Apriori算法是发现频繁项集的常用算法,然而spark的mklib并没有实现这一算法。
在最近的spark峰会上,南京大学计算机系博士生顾荣发表了YAFIM: 基于Spark的并行化频繁项集挖掘算法的演讲,基于他的演讲以及相关论文http://pasa-bigdata.nju.edu.cn/people/ronggu/pub/YAFIM_ParLearning.pdf,我用java在spark上实现了Apriori算法。
代码如下,其中用到了谷歌的guava,同时参照http://blog.youkuaiyun.com/gameloft9/article/details/25556681实现了一个组合算法。
共两个java文件,FIM 和 Algorithms,同时附上一组测试数据。
import com.google.common.collect.Lists;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.io.Serializable;
import java.util.*;
public class FIM
{
public static void calcFrequencyItem()
{
SparkConf conf = new SparkConf().setAppName( "fim" ).setMaster( "local" );
JavaSparkContext context = new JavaSparkContext( conf );
JavaRDD<String> dataset = context.textFile( "itemset.txt" );
//计算频繁项集1
List<Tuple2<Item, Integer>> itemsetL = dataset.flatMap( new FlatMapFunction<String, Item>()
{
@Override
public Iterable<Item> call( String s ) throws Ex