私は次のコードを持っています:
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()の出力はありません!ここに何か足りませんか?ありがとう!
ユーティリティ関数を作成することで回避できました:
object PrintUtiltity {
def print(data:String) = {
println(data)
}
}
これは概念的な質問です...
n
ワーカーと、それらのワーカーがRDD
またはDataFrame
のパーティションを格納しているとしましょう。map
そのデータにまたがるタスク、およびそのmap
の中には、まずprint
ステートメントがあります。
それらはあまりにも多くの質問であるため、Apache-spark
の設計者/保守者は、map-reduce
操作内のprint
ステートメントに対するサポートを削除することを論理的に決定しました(これにはaccumulators
broadcast
変数)。
これは、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)