我正在使用Spark 1.5.0(cdh5.5.2)。我在我的交易数据上运行FpGrowth算法,每次都得到不同的结果。我使用linux diff命令检查了我的交易数据,发现没有区别。 Scala中的fpgrowth函数是否包含任何随机种子?为什么每次都会得到不同数量的频繁项目集?有没有随意打破的领带?此外,我使用的支持值非常低 - 当我增加支持时,此问题不存在。我使用的支持是0.000459。当我将此值增加到0.005时,我没有收到错误。是否有需要使用的最低支持门槛?
感谢您的帮助。
以下是我使用的代码:
val conf = new SparkConf() conf.registerKryoClasses(Array(classOf [ArrayBuffer [String]],classOf [ListBuffer [String]]))
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长度时,每次都会得到不同的数字。
答案 0 :(得分:0)
问题是Cloudera默认启用了Kryo Serializer。 Spark下载(单独)默认情况下具有Java Serializer。当我使用Kryo Serializer运行FPGrowth时,它会要求注册Kryo类。一旦我这样做,就没有错误弹出。但是,结果不正确。一旦我将其更改回Java Serializer,结果是正确的,并与Spark 1.6.0中的结果相匹配。我仍然不知道问题是在FPGrowth函数本身,还是Kryo序列化也影响其他函数/库。