【问题标题】:scala spark mllib fpgrowth returns different answer each timescala spark mllib fpgrowth 每次返回不同的答案
【发布时间】:2016-06-13 05:39:53
【问题描述】:

我使用的是 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")

我在事务计数中得到相同的数字。但是,当我打印作为 FPGrowth 输出的 RDD 长度时,每次都会得到不同的数字。

【问题讨论】:

  • 我们很乐意为您提供帮助,但如果没有可重现的示例,那么我们就不可能。
  • FPgrowth 每次都应该返回完全相同的结果。启动调试器 - 您身边或 Mllib 中可能存在错误。
  • 这是一个 80MB 的文件。我尝试仅对前 1000 笔交易进行测试,但无法重现 Alberto Bonsanto。我会尝试看看是否可以用更少的记录来模拟问题。我目前正在调试,但对于相同的输入文件和相同的截止,我得到不同的输出。当支持更高一点时,没有问题。

标签: scala apache-spark data-mining apache-spark-mllib


【解决方案1】:

问题是 Cloudera 默认开启了 Kryo Serializer。 Spark 下载(单独)默认具有 Java Serializer。当我使用 Kryo Serializer 运行 FPGrowth 时,它会要求注册 Kryo 类。一旦我这样做了,就不会弹出错误。然而,结果是不正确的。一旦我将它改回 Java Serializer,结果是正确的,并且与 Spark 1.6.0 中的结果相匹配。我仍然不知道问题出在 FPGrowth 函数本身还是 Kryo 序列化也会影响其他函数/库。

【讨论】:

  • 另外,我认为它每次只返回一个节点的结果,因为实际结果的大小比打印的要大得多。工人之间的协调沟通存在一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2022-12-17
相关资源
最近更新 更多