org.apache.spark.sparkexception:任务不可序列化如何在map{}中运行方法

xj3cbfub  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(456)

我尝试调用一个值的方法。但是有个错误。我的方法。

  1. processDate(p(2))

这些值看起来有点像20160125204123
这是我的课。

  1. class ScalaJob(sc: SparkContext) {
  2. def run(filePath: String) : RDD[(String, String, String)] = {
  3. //pass the file
  4. val file = sc.textFile(filePath);
  5. //find values in every raw
  6. val values = file.map{
  7. dataRaw =>
  8. val p = dataRaw.split("[|]",-1)
  9. (p(1), processDate(p(2)), p(32))
  10. }

我的方法应该返回一个字符串

  1. def processDate(s: String) : String = {

有办法让它工作吗?

vfwfrxfs

vfwfrxfs1#

错误来了,因为 sc: SparkContext 本质上是不可序列化的。spark将尝试发送整个scalajob以关闭,其中包括 sc . 问题就出在这里。解决办法是 sc @transient 你的班级定义应该是这样的

  1. class ScalaJob(@transient sc: SparkContext ) extends Serializable { }
uubf1zoe

uubf1zoe2#

里面有没有密码 RDD.map 在这种情况下 file.map 将序列化并发送给执行者。因此,要实现这一点,代码应该是可序列化的。在本例中,您使用了 processDate 这在别处有定义。确保在其中定义方法的类是可序列化的。注意:您需要使整个依赖链可序列化。一个快速的选择是绑定 processDate 将val作为函数并在内部使用它 RDD . 或者在对象中定义方法。例子:

  1. class ScalaJob(sc: SparkContext) {
  2. def run(filePath: String): RDD[(String, String, String)] = {
  3. //pass the file
  4. val file = sc.textFile(filePath);
  5. //find values in every raw
  6. val process = processDate _
  7. val values = file.map {
  8. dataRaw =>
  9. val p = dataRaw.split("[|]", -1)
  10. (p(1), process(p(2)), p(32))
  11. }
  12. }
  13. }

有关详细信息,请参阅spark任务不可序列化

展开查看全部

相关问题