新手。我尝试从示例中学习Scala,我发现了一些创建AssociationRules source code here
的Spark代码def run[Item: ClassTag](freqItemsets: RDD[FreqItemset[Item]]): RDD[Rule[Item]] = {
// For candidate rule X => Y, generate (X, (Y, freq(X union Y)))
val candidates = freqItemsets.flatMap { itemset =>
val items = itemset.items
items.flatMap { item =>
items.partition(_ == item) match {
case (consequent, antecedent) if !antecedent.isEmpty =>
Some((antecedent.toSeq, (consequent.toSeq, itemset.freq)))
case _ => None
}
}
}
我尝试低估了run
函数的工作原理以及算法在case
中如何理解antecedent
为X且consequent
为Y.如何划分项目?
另一个问题:join
函数如何工作(如下)? freqAntecedent
是x.freq
吗? freqUnion
如何在map
中展示?
candidates.join(freqItemsets.map(x => (x.items.toSeq, x.freq)))
.map { case (antecendent, ((consequent, freqUnion), freqAntecedent)) =>
new Rule(antecendent.toArray, consequent.toArray, freqUnion, freqAntecedent)
}.filter(_.confidence >= minConfidence)
感谢您的帮助!
答案 0 :(得分:1)
生成(X, (Y, freq(X union Y)))
表示项是值(2元组)的值。元组有一个unapply
方法,允许在其上进行模式匹配,即您在case
语句中看到的内容。每当类实现unapply
时,您都可以在case
语句中使用它,您可以将其分解为其属性并将每个属性分配给变量。