2016-02-26 67 views
0

越来越java.util.NoSuchElementException斯卡拉 - 让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) 

'数据' 元组例如: (000496120-01,(一些(药物(000496120-01,星期五2005年7月1日15点一十五分○○秒EDT,硫酸鱼精蛋白)) ,一些(诊断(000496120-01,星期一2007年1月15:00:00 EST 2013,v70.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)) 
过滤器的代码或药物目录

希望这有助于

+0

你的问题的旁边,'x._2._1'这看起来可疑,像不可读的代码/坏实践。你可以阅读'case class's。 –

+1

您需要提供更多的上下文以获得更有意义的帮助。我可以搜集的是,它看起来像任何'x._2._1'是一个空的'List',结果调用'.last'就会抛出一个错误。 – badcook

+0

提供了更多的上下文 – novicecoder123

回答

1

计数,统计集合中有多少项目,因为该等式返回true。您可能需要使用size或传递一个项目进行计数。

编辑

除了您的编辑:
BENS的解决方案是美丽的,但你可以写

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

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

2

对空的List调用last将导致此异常被抛出。

你可以写你的过滤谓词安全地处理一个空列表,通过使用lastOption,例如:

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

增加了更多的上下文 - 再次看到问题定义 - 你的建议确保没有错误了,但过滤器没有正确发生 – novicecoder123

+0

你摇滚 - 我正在编码错误 - 实际上你的建议工作 - 谢谢。 – novicecoder123