我得到"任务不可序列化"由于RDD上的foreach方法中的assert语句导致的错误。是否有任何解决方法为RDD的每个元素编写断言?
class myTest extends Funsuite {
//some code to create spark context(sc)
var arrRDD = sc.parallelize(Array(1,1,1,1,1))
test("custom test"){
arrRDD.foreach{
x => {
//commenting out this assert removes the error
assert(x == 1)
}
}
}
}
答案 0 :(得分:0)
RDD(弹性分布式数据集)是一个集群,它分布在集群中的节点上。当我们工作时,我们只看到单个机器中的集合,这是由于抽象。
当您运行RDD.map
或任何其他转换,例如map
,filter
等时,会将其序列化并移至群集上的其他节点并在这些节点上执行。
"Task not serializable"
中的错误是由于序列化的转换arrRDD.foreach
引起的,但"assert"
中的方法未被序列化,因此无法将其移动到其他节点。< / p>
如果您只想assert
collect
这个值,只需array
它就可以将数据作为assert
和arrRDD.collect().foreach{
x => assert (x == 1)
}
传递给驱动程序节点
{{1}}
但我不认为这仍然是一个好方法!
希望这对你有所帮助:)
答案 1 :(得分:0)
如果要测试这个小用例,可以将其收集到实际的scala集合中,然后使用断言。就像尚卡尔说的那样。
如果您想要更广泛的单元测试,可以使用unit testing framework。