我尝试调用一个值的方法。但是有个错误。我的方法。
processDate(p(2))
这些值看起来有点像20160125204123
这是我的课。
class ScalaJob(sc: SparkContext) {
def run(filePath: String) : RDD[(String, String, String)] = {
//pass the file
val file = sc.textFile(filePath);
//find values in every raw
val values = file.map{
dataRaw =>
val p = dataRaw.split("[|]",-1)
(p(1), processDate(p(2)), p(32))
}
我的方法应该返回一个字符串
def processDate(s: String) : String = {
有办法让它工作吗?
2条答案
按热度按时间vfwfrxfs1#
错误来了,因为
sc: SparkContext
本质上是不可序列化的。spark将尝试发送整个scalajob以关闭,其中包括sc
. 问题就出在这里。解决办法是sc @transient
你的班级定义应该是这样的uubf1zoe2#
里面有没有密码
RDD.map
在这种情况下file.map
将序列化并发送给执行者。因此,要实现这一点,代码应该是可序列化的。在本例中,您使用了processDate
这在别处有定义。确保在其中定义方法的类是可序列化的。注意:您需要使整个依赖链可序列化。一个快速的选择是绑定processDate
将val作为函数并在内部使用它RDD
. 或者在对象中定义方法。例子:有关详细信息,请参阅spark任务不可序列化