scala - 获取java.util.NoSuchElementException

时间:2016-02-26 07:27:21

标签: scala

获取java.util.NoSuchElementException

val data3 = data2.filter(x => type1_dm_med.contains(x._2._1.last.medicine))

当我尝试print data3.count时出现以下错误 - 不确定如何解决,请帮助

[Stage 50:=====> (20 + 1) / 200]16/02/26 01:37:11 ERROR Executor: Exception in task 22.0 in stage 50.0 (TID 1636)
java.util.NoSuchElementException
at scala.collection.LinearSeqOptimized$class.last(LinearSeqOptimized.scala:135)
at scala.collection.immutable.List.last(List.scala:84)

更多背景信息:

 class Diagnostic(patientID:String, date: Date, code: String)
 class Medication(patientID: String, date: Date, medicine: String)

将.csv中的数据加载到药物中:RDD [药物]和诊断:
 RDD [诊断]

val mpairs = medication.map(x=>(x.patientID,x))
val dpairs = diagnostic.map(x=>(x.patientID,x))
val data = mpairs.fullOuterJoin(dpairs)

'data'元组示例: (000496120-01,(Some(Medication(000496120-01,Fri Jul 01 15:15:00 EDT 2005,硫酸鱼精蛋白)),Some(Diagnostic(000496120-01,Mon Jan 07 15:00:00 EST 2013,v70) 0.0))))

type1_dm_dx et'al是想要过滤的代码或药物列表

val cond1 = data.filter(x => type1_dm_dx.contains(x._2._2.last.code))
val data1 = data.subtractByKey(cond1)
val data2 = data1.filter(x => type2_dm_dx.contains(x._2._2.last.code))
val data3 = data2.filter(x => type1_dm_med.contains(x._2._1.last.medicine))

希望这会有所帮助

2 个答案:

答案 0 :(得分:2)

在空last上调用List会导致抛出此异常。

您可以使用lastOption编写过滤谓词以安全地处理空列表,例如:

x => x._2._1.lastOption.exists(y => type1_dm_med.contains(y.medicine))

答案 1 :(得分:1)

计数,计算集合中有多少项,因为它等于返回true。您可能希望使用size或将项目传递给计数。

修改

除了您的编辑:
Bens解决方案很漂亮,但你可以写

x => x._2._1.nonEmpty && type1_dm_med.contains(x._2._1.last.medicine)

也是。它可能使您的代码更具可读性,具体取决于上下文 您应该考虑使用其他东西然后使用tupels。 classcase class会使您的代码更易于阅读x._2._1. 如果你想使用tupel,case class通常是更好的解决方案。你可以考虑case class就像一个名为tupel的人。它符合相同的需求,但更具可读性。