gpt4 book ai didi

scala - Spark 在stdout上丢失println()

转载 作者:行者123 更新时间:2023-12-03 14:06:07 25 4
gpt4 key购买 nike

我有以下代码:

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()输出!我在这里想念什么吗?谢谢!

最佳答案

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

想象您有一个很大的集群,由许多工作人员组成,比如说n工作人员,而这些工作人员存储了RDDDataFrame的分区,假设您在该数据中启动了一个map任务,并且在该 您首先有一个 map语句:


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


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

这也很有意义,因为Spark是为大型数据集设计的语言。尽管打印对于测试和调试很有用,但您不希望打印DataFrame或RDD的每一行,因为它们被构建为具有数百万或数十亿行!那么,当您甚至根本不想打印时,为什么还要处理这些复杂的问题呢?

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

// Let's create a simple RDD
val rdd = sc.parallelize(1 to 10000)

def printStuff(x:Int):Int = {
println(x)
x + 1
}

// It doesn't print anything! because of a logic design limitation!
rdd.map(printStuff)

// But you can print the RDD by doing the following:
rdd.take(10).foreach(println)

关于scala - Spark 在stdout上丢失println(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com