在地图操作中使用变量引发火花错误

时间:2018-07-16 04:30:20

标签: apache-spark apache-spark-sql

我试图遍历DataFrame并在其行上应用映射操作。

import spark.implicits._
import org.apache.spark.sql.Row
case class SomeData(name:String, value: Int)

val input = Seq(SomeData("a",2), SomeData("b", 3)).toDF

val SOME_STRING = "some_string"

input.map(row =>
  SOME_STRING
).show

以上代码由于以下异常而失败

ERROR TaskSetManager: Task 0 in stage 4.0 failed 4 times; aborting job
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 4.0 failed 4 times, most recent failure: Lost task 0.3 in stage 4.0 (TID 14, ip-xxxx, executor 4): java.lang.NoClassDefFoundError: L$iw;
        at java.lang.Class.getDeclaredFields0(Native Method)
        at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
        at java.lang.Class.getDeclaredField(Class.java:2068)

但是,如果将变量替换为字符串,则代码有效。

input.map(row =>
  "some_string"
).show

+-----------+
|      value|
+-----------+
|some_string|
|some_string|
+-----------+

上面的代码有什么问题吗?是否可以在map操作中使用变量和函数调用。

1 个答案:

答案 0 :(得分:1)

很正常,您的变量是在驱动程序内部定义的,然后在worker内部使用,因此您的worker不知道该变量。

您可以做的是:

input.map(row =>
   val SOME_STRING = "some_string"
).show

您还可以检查广播变量:https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#broadcast-variables