我有以下代码:
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()输出!我在这里错过了什么吗?谢谢!
答案 0 :(得分:16)
这是一个概念性问题......
想象一下,你有一个庞大的集群,由许多工人组成,我们说n
工人和那些工人存储RDD
或DataFrame
的分区,想象你开始{{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)
}
}