2016-03-02 39 views
0

我有一個關於用Scala過濾FrequetItemset的初學者問題。如何過濾FrequentItemset?

代碼首先書:

import org.apache.spark.mllib.fpm.FPGrowth 
import org.apache.spark.rdd.RDD 

val transactions: RDD[Array[String]] = data.map(s => s.trim.split(',')) 

val fpg = new FPGrowth() 
.setMinSupport(0.04) 
.setNumPartitions(10) 

    val model = fpg.run(transactions) 

現在我想篩選出的項目與'aaa'開始,例如"aaa_ccc",從結果

我想:

val filtered_result = model.freqItemsets.itemset.filter{ item => startwith("aaa")} 

and

val filtered_result = model.freqItemsets.filter(itemset.items => startwith("aaa")) 

val filtered_result = model.freqItemsets.filter(itemset => items.startwith("aaa")) 

我做了什麼錯?

回答

2

任何建議的代碼不會編譯。所以我不確定你所說的問題是爲什麼不編譯或是你得到錯誤的結果。

coll filter { item => filterLogic(item) } 

所以過濾freqItemsets你會使用類似::

model.freqItemsets filter { itemSet => filterLogic(itemSet) } 

Scala集合可以使用過濾方法,並把法作爲一個參數,它可以在一對夫婦的方式被寫入過濾

如果您想篩選包含以「AAA」

model.freqItemsets filter { itemSet => itemSet.items exists { item => item.startsWith("aaa") } 
開始至少一個字符串的所有freqItemsets

或者如果你的目標是要篩選freqItemset然後裏面的物品:

model.freqItemsets map { itemSet => itemSet.copy(items = itemSet filter { _.startsWith("aaa") }) } 

注意,在Scala中您可以使用: someCollection filter { item => item.startsWith("string") }這是一樣的:someCollection filter { _.startsWith("string") }

希望這有助於。

+0

很好的解釋。謝謝 !我是scala新手,有時代碼包含句點,方法之間有時間空間。爲什麼? – Toren

+0

可以說你有一個包含foo方法的類的實例。 看起來像這樣: 'class A {{{{def foo(bar:A)= ??? }' 然後可以使用方法爲: 'VAL A =新的A VAL B =新的A 一個Foo b a.foo(B)' 編輯:在Scala中一切是一個函數,連+運算符用於累加兩個Ints,例如1 + 2.您可以將其寫爲:1。+(2)' –

1

itemsArray[String]。如果你想filter包含這是項目的任何項目集與aaa開始,你需要這樣的事:

model.freqItemsets.filter(_.items.exists(_.startsWith("aaa")))