sc.parallelize丢失先前构造的DF

时间:2017-12-13 21:44:45

标签: scala apache-spark

我将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

0 个答案:

没有答案