我从以下代码中收到Task not serializable
错误。
var inputRDD = sc.textFile(inputPath).flatMap(line => line.split(":")).map{word => (word)}
var i = 1
var characters:Array[String] = new Array[String](3)
characters = Array("a","i","m")
for (i <- 1 to 4){
inputRDD.foreach { word =>
sc.broadcast(replacement)
val result = word.replaceAll(replacement, "b")
println(word,result)
replacement = characters(i)
}
}
我在网上找不到任何帮助。我需要一些帮助。 感谢
答案 0 :(得分:1)
此代码尝试在RDD的闭包内使用SparkContext(sc
)。 sparkContext
不可序列化,并不意味着在其使用中序列化。
我不清楚这段代码试图实现什么,但需要更改它以从任何闭包中删除sparkContext
的使用。
答案 1 :(得分:0)
@maasg已经回答了你的问题。但代码是错误的,我认为你需要一些帮助才能使它运行起来。我不知道您是否通读了http://spark.apache.org/docs/latest/programming-guide.html。
你的错误:
map{word => (word)}
什么也没做。它只是将每个单词映射到自身。i
未使用。 for
循环声明了一个新变量。您不需要预先声明循环变量。characters
的初始值并立即替换。为什么不从最终值开始呢?然后,所有var
都可以是val
s。 val
更容易使用,因为它们不会改变价值观。foreach
内,您尝试为replacement
创建一个未声明的广播变量。必须在驱动程序上运行的代码中调用sc.broadcast
(foreach
的主体将在执行程序中运行)。 sc.broadcast
返回一个广播变量,然后您可以在执行程序上运行的代码中使用该变量。相反,你只需从地面上的返回变量开始。broadcast
仅对大值(例如&gt; 10kB)很重要。暂时不要担心。characters
)从1索引到4。有效索引从0到2。foreach
不能用于修改RDD。 RDD是不可变的。您需要使用map
代替从原始RDD创建新的修改过的RDD。我对您尝试做的事情的猜测是加载文件,拆分冒号并用{{替换三个字母(a
,i
,m
) 1}}。以下是如何做到这一点:
b