这是我的第一个问题,我希望我能正确地做到这一点。
所以,我试图进入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%左右,所以它应该显得频繁,而不是我的结果。
提前谢谢!
答案 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
,例如enum
,AGE_BETWEEN_0_18
。
这样你就可以缩小直方图,让FP-growth完美运作。
P.S。:我不确定该对象应该被称为AGE_BETWEEN_18_25
,我宁愿将其命名为Bank