數據格式:
蘋果 梨 香蕉
梨 牛奶 土豆
蘋果 香蕉 狗
狗 土豆
土豆 牛奶 鹽
鹽 梨 狗
蘋果 梨 狗
package com.agm.guanlian
import org.apache.spark.mllib.fpm.FPGrowthimport org.apache.spark.{SparkConf, SparkContext}
import java.io._
import org.apache.log4j.{Level, Logger}
object FPGrowth {
def main(args:Array[String]){
Logger.getLogger("org").setLevel(Level.ERROR)
val conf = new SparkConf().setAppName("FPGrowthTest").setMaster("local").set("spark.sql.warehouse.dir","E:/ideaWorkspace/ScalaSparkMl/spark-warehouse")
val sc = new SparkContext(conf)
//設置參數
//最小支持度
val minSupport=0.2
//最小置信度
val minConfidence=0.6
//數據分區
val numPartitions=2
//取出數據
val data = sc.textFile("F:\\testData\\spark\\FPGrowth.txt")
//把數據通過空格分割
val transactions=data.map(x=>x.split(" "))
transactions.cache()
//創建一個FPGrowth的算法實列
val fpg = new FPGrowth()
//設置訓練時候的最小支持度和數據分區
fpg.setMinSupport(minSupport)
fpg.setNumPartitions(numPartitions)
//把數據帶入算法中
val model = fpg.run(transactions)
//查看所有的頻繁項集,並且列出它出現的次數
model.freqItemsets.collect().foreach(itemset=>{
println( itemset.items.mkString("[", ",", "]")+","+itemset.freq)
})
//通過置信度篩選出推薦規則則
//antecedent表示前項
//consequent表示後項
//confidence表示規則的置信度
//這裏可以把規則寫入到Mysql數據庫中,以後使用來做推薦
//如果規則過多就把規則寫入redis,這裏就可以直接從內存中讀取了,我選擇的方式是寫入Mysql,然後再把推薦清單寫入redis
model.generateAssociationRules(minConfidence).collect().foreach(rule=>{
println(rule.antecedent.mkString(",")+"-->"+
rule.consequent.mkString(",")+"-->"+ rule.confidence)
})
//查看規則生成的數量
println(model.generateAssociationRules(minConfidence).collect().length)
//並且所有的規則產生的推薦,後項只有1個,相同的前項產生不同的推薦結果是不同的行
//不同的規則可能會產生同一個推薦結果,所以樣本數據過規則的時候需要去重
}
}