在大型数据集的spark中使用collect()进行FP增长

时间:2017-01-20 12:06:57

标签: algorithm scala apache-spark apache-spark-mllib

我正在使用以下代码在FP Growth算法中生成关联规则。

model.generateAssociationRules(minConfidence).collect().foreach { rule =>
println(
rule.antecedent.mkString("[", ",", "]")
  + " => " + rule.consequent .mkString("[", ",", "]")
  + ", " + rule.confidence)
}

但是每当我试图在拥有1亿条记录的大数据表上运行该算法时,它就会因java堆空间错误而失败。

使用collect()方法在大数据集上执行FP增长算法的替代方法是什么?

我正在使用带有scala 2.10的spark 1.6.2

解决方案代码

val parts1 = model.freqItemsets.partitions
  parts1.map(p => {
    val idx1 = p.index
    val partRdd1 = model.freqItemsets.mapPartitionsWithIndex {
      case(index:Int,value:Iterator[FPGrowth.FreqItemset[String]]) =>
        if (index == idx1) value else Iterator()}
    val dataPartitioned = partRdd1.collect().foreach{itemset =>
      MasterMap1(itemset.items.mkString(",").replace(" ","")) = (itemset.freq / size).toString }
  })

1 个答案:

答案 0 :(得分:-1)

尝试增加驱动程序内存(如果适用)。如果你在纱线上运行你的应用程序那么最好根据容器内存为驱动程序配置内存哪个驱动程序堆内存+内存占用(堆内存的15%)=(应该是)纱线容器内存