以下代码试图解析文件但是,当我尝试访问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)
任何想法可能会出现什么问题?以及如何处理异常?
答案 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