我们如何避免与MapPartition相关的问题?

时间:2015-08-20 09:04:27

标签: scala apache-spark

val counts = parsed.mapPartitions(iter => {
  iter.flatMap(point => {
    println("points"+point) 
    point.indices.map(i => i,point(i)))
  })
}).countByValue() 
val count = parsed.mapPartitions(iter => {
  iter.flatMap(point => {
    println("pointsssss" + point.deep)
    point.indices.map(i => (i, point(i)))
  }) 
}).countByValue()

当我执行count.foreach(println)时,我也会从counts获得输出。我该如何避免这个问题?

1 个答案:

答案 0 :(得分:0)

您看到两个打印语句的原因是countByValue本身是一个操作而不是转换,它会触发RDD的评估(在这种情况下,它们都是)。来自文档:

  

def countByValue():Map [T,Long]

     

将此RDD中每个唯一值的计数作为(值,计数)对的映射返回。最后的组合步骤在主服务器上本地发生,相当于运行单个减少任务。

您的下一个代码count.foreach(println)因此在主节点中的正常Scala集合中的Spark之外发生。

检查逻辑是否这不是你想要的行为,我怀疑你想要countByKey()(也是一个动作)。