spark任务中的异常,如何处理以下代码中的异常?

时间:2016-01-05 05:44:15

标签: scala apache-spark rdd

以下代码试图解析文件但是,当我尝试访问RDD中的元素时,它会不断引发异常。

val raw_data = sc.textFile(path).map(_.split(",")).mapPartitions(_.drop(1)).filter(_.size > 4).map(s=>s)  //remove header and empty entries
raw_data.count
val raw_by_user: RDD[(String, Iterable[Array[String]])] = raw_data.map{s =>
  if(s.size > 3)
  (s(0), Array[String](s(0),toStandarddate(s(2)),toEntryExit(s(3)),s(5),s(6) ,jr_type,"TST_0", stationMap(s(5)),stationMap(s(6))))
  else{
    println(s(0) , s.mkString(","))
    (s(0) , Array[String]())
  }
}.groupByKey()

raw_by_user.count

错误:

  

16/01/05 13:39:30错误执行者:阶段2.0中的任务0.0中的异常   (TID 4)java.util.NoSuchElementException:找不到键:2 at   scala.collection.MapLike $ class.default(MapLike.scala:228)at   scala.collection.AbstractMap.default(Map.scala:58)at   scala.collection.mutable.HashMap.apply(HashMap.scala:64)at   DataCreation.ProcessData $$ anonfun $ 9.apply(package.scala:77)at   DataCreation.ProcessData $$ anonfun $ 9.apply(package.scala:75)at   scala.collection.Iterator $$匿名$ 11.next(Iterator.scala:328)

任何想法可能会出现什么问题?以及如何处理异常?

2 个答案:

答案 0 :(得分:0)

.mapPartitions(_.drop(1))不正确。如果你尝试在spark-shell上运行它,你会得到一个空的RDD:

sc.parallelize(List("header", "cat,dog", "a1,b1,c1,d1,e1,f1"))
  .map(_.split(",")).mapPartitions(_.drop(1)).collect()

您需要找到另一种方法来删除标题行,具体取决于您的数据。也许你可以过滤它,或者你可以使用方法described here

答案 1 :(得分:0)

我同意@jbrown说,你需要以另一种方式删除标题。

正如here所述,逃离第一行的最有效方法是

raw_data.mapPartitionsWithIndex { (idx, iter) => if (idx == 0) iter.drop(1) else iter }

或者如果你喜欢

raw_data = sc.textFile('path_to_data')
header = raw_data.first() #extract header
data = raw_data.filter(lambda x:x !=header)    #filter out header