使用FP-growth实现Apache Spark教程,在freqItemsets上没有结果

时间:2016-07-08 08:02:43

标签: scala apache-spark data-mining

这是我的第一个问题,我希望我能正确地做到这一点。

所以,我试图进入Apache Spark及其FP-growth算法。因此,我尝试将FP-growth教程应用于Spark附带的银行教程。

我对所有这些数据映射的东西和scala都很陌生,所以这个问题对你们来说似乎很基本,但我感谢你的帮助!

case class Bank(age:Integer, job: String, marital: String, education: 
                String, balance: Integer)

val bank = bankTest.map(s=>s.split(";")).filter(s=>s(0)!= "\"age\"").map(
 s=>Bank(s(0).toInt,
         s(1).replaceAll("\"", ""),
         s(2).replaceAll("\"", ""),
         s(3).replaceAll("\"", ""),
         s(5).replaceAll("\"", "").toInt

  )
)

val transactions: RDD[Array[Object]] = bank.map(x => Array(x))

val fpg = new FPGrowth()
  .setMinSupport(0.1)
  .setNumPartitions(10)
val model = fpg.run(transactions)

model.freqItemsets.collect().foreach { itemset =>
  println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
}

这是我编码的,我认为问题是我的银行元素到事务变量的映射。代码运行正常,但没有结果。我想这是因为FP-growth算法将类型库中的不同对象相互比较,这些对象包含在事务变量中。当然,没有一个支持20%的完整对象。

所以问题是:如何对我的数据中的COLUMNS进行FP增长检查,而不是整个对象?

例如:支持" job = manager"应该是20%左右,所以它应该显得频繁,而不是我的结果。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是创建一个toList方法,该方法只返回一个包含银行所有成员的列表:

... UPDATE price=IF(price < 2*$pmin, 291, price)

请注意,我使用字符串列表作为FP-growth与“分类项目”一起使用。这意味着如果您输入整数或浮点数作为工资或年龄,如果它们相差一分(年龄相同),它会将每个单独的工资视为唯一的:

case class Bank(age:Integer, job: String, marital: String, education: String, balance: Integer)
{
    def toList():List[String]=
    {
        List(""+age, job, marital, education, ""+balance);
    }
}

虽然val bank1 = Bank(35, "engineer", "engaged", "college", 100000) val bank2 = Bank(35, "engineer", "engaged", "college", 100001) bank1的薪水非常接近,但FP-growth会认为这两项不同。因此,当工资分歧较大时,您将无法对工资进行分类。

我建议为每个年龄类工资类定义bank2,例如enumAGE_BETWEEN_0_18

这样你就可以缩小直方图,让FP-growth完美运作。

P.S。:我不确定该对象应该被称为AGE_BETWEEN_18_25,我宁愿将其命名为Bank