我将dd列表从hdfs转换为IDS数组。接下来我查询MySQL来创建一个DataFrame。迭代IDS数组时,我将DF传递给一个方法,用于创建未来处理所需的补充值Map。但是,如果我对阵列进行并行化,则在调用DF时作业会丢失并失败。为什么?
下面是一些示例代码。它有些简化了我的问题,但最能说明问题。如果我删除了sc.paralelleize
并转到ids.map
它的功能,那么我在mapPartitions
中运行的下一个操作(未列出)就不可用。
def main(args: Array[String]) {
val ids = getIds(hdfsPath)
val idInfoDf = idInfoDf(sparkSession)
idInfoDf.cache()
sc.paralleize(ids).map(id => prepare(ss,id,idInfoDf)).foreach(println(_))
}
def prepare(ss: SparkSession, id: String, df: DataFrame): Map[String, String] = {
import ss.implicits._
val row = df.select($"term",$"region")
.where($"id" === id.toUpperCase())
row.collect.map(r => Map[String,String](
"term" -> r.getAs[String](0),
"region" -> r.getAs[String](1))).head
}
另外,我也是scala和spark的新手。这是一种令人兴奋的语言,但我也不反对提高代码质量的建议。
返回错误的示例:
错误TaskSetManager:阶段1.0中的任务12失败了4次;中止 作业线程“main”中的异常org.apache.spark.SparkException:Job 由于阶段失败而中止:阶段1.0中的任务12失败了4次, 最近的失败:1.0阶段失去任务12.3(TID 52, 192.168.10.196,executor 0):java.lang.NullPointerException