2016-02-29 117 views
0

我正在使用Spark 1.5.0(cdh5.5.2)。我在我的交易數據上運行FpGrowth算法,每次都得到不同的結果。我使用linux diff命令檢查了我的交易數據,發現沒有區別。 Scala中的fpgrowth函數中是否有任何隨機種子?爲什麼我每次都得到不同數量的頻繁項目集?是否有任何領帶隨機破碎?另外,我使用的支持值非常低 - 當我增加支持時,此問題不存在。我使用的支持是0.000459。當我增加到0.005我沒有得到錯誤。是否有需要使用的支持的最低門檻?scala spark mllib fpgrowth每次都會返回不同的答案

感謝您的幫助。

這裏是我使用的代碼:)

VAL CONF =新SparkConf( conf.registerKryoClasses(陣列(classOf [ArrayBuffer [字符串]],classOf [ListBuffer [字符串]]))

val sc = new SparkContext(conf) 

val data = sc.textFile("path/test_rdd.txt") 
val transactions = data.map(x=>(x.split('\t'))) 
val transactioncount = transactions.count() 
print(transactioncount) 
print("\n") 
transactions.cache() 
val fpg = new FPGrowth().setMinSupport(0.000459) 
val model = fpg.run(transactions) 
print("\n") 
print(model.freqItemsets.collect().length) 
print("\n") 

我在transactioncount中得到相同的數字。但是,當我輸出FPGrowth輸出的RDD長度時,每次都得到不同的數字。

+4

我們很樂意幫助您,但如果沒有可重複的例子,那麼我們就不可能。 –

+1

FPgrowth應該每次都返回完全相同的結果。啓動一個調試器 - 可能有一個錯誤,在你身邊或在Mllib中。 –

+0

這是一個80MB的文件。我試着只對前1000個交易進行測試,但我無法複製Alberto Bonsanto。我會試着看看是否可以用較少的記錄數來模擬問題。我目前正在調試過程中,但是對於相同的輸入文件和相同的截止點,我得到不同的輸出。當支持稍高一點時,沒有問題。 – user1050325

回答

0

問題在於Cloudera默認情況下已啓用Kryo Serializer。 Spark下載(單獨)默認具有Java Serializer。當我使用Kryo Serializer運行FPGrowth時,它會要求註冊Kryo類。一旦我這樣做,沒有錯誤出現。但是,結果不正確。一旦我將它更改回Java Serializer,結果是正確的,並且與Spark 1.6.0中的結果相匹配。我仍然不知道問題出在FPGrowth函數本身還是Kryo序列化影響其他函數/庫。

+0

此外,我*認爲它每次只返回一個節點的結果,因爲實際結果的尺寸比打印的結果大得多。工人之間的協調溝通存在一些問題。 – user1050325

相關問題