Spark在stdout上丢失了println()

时间:2015-10-20 00:14:56

标签: scala apache-spark println accumulator

我有以下代码:

val blueCount = sc.accumulator[Long](0)
val output = input.map { data =>
  for (value <- data.getValues()) {
    if (record.getEnum() == DataEnum.BLUE) {
      blueCount += 1
      println("Enum = BLUE : " + value.toString()
    }
  }
  data
}.persist(StorageLevel.MEMORY_ONLY_SER)

output.saveAsTextFile("myOutput")

然后blueCount不为零,但我没有println()输出!我在这里错过了什么吗?谢谢!

2 个答案:

答案 0 :(得分:16)

这是一个概念性问题......

想象一下,你有一个庞大的集群,由许多工人组成,我们说n工人和那些工人存储RDDDataFrame的分区,想象你开始{{1}这个数据的任务,map内部有map语句,首先是:

  • 该数据将在何处打印出来?
  • 哪个节点具有优先级和哪个分区?
  • 如果所有节点并行运行,谁将首先打印?
  • 如何创建此打印队列?

这些问题太多,因此print的设计人员/维护人员在逻辑上决定放弃对任何apache-spark操作中的print语句的任何支持(包括map-reduce和甚至accumulators变量。)

这也很有意义,因为Spark是一种非常大的数据集的设计语言。虽然打印对测试和调试很有用,但您不希望打印DataFrame或RDD的每一行,因为它们构建为具有数百万或数十亿行!那么,当你甚至不想首先打印时,为什么要处理这些复杂的问题?

为了证明这一点,您可以运行此scala代码,例如:

broadcast

答案 1 :(得分:2)

我能够通过制作实用功能来解决这个问题:

object PrintUtiltity {
    def print(data:String) = {
      println(data)
    }
}