我试图遍历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操作中使用变量和函数调用。
答案 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