簡體   English   中英

Scala-獲取java.util.NoSuchElementException

[英]scala - getting 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)

'data'元組示例:(000496120-01,(Some(Medication(000496120-01,Fri Jul 01 15:15:00 EDT 2005,Protamine protamine))),Some(Diagnostic(000496120-01,Mon Jan 07 15:00 :00 EST 2013,v70.0))))

type1_dm_dx等是要過濾的代碼或葯品列表

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))

希望這可以幫助

在一個空的List上調用last將導致拋出此異常。

您可以使用lastOption編寫過濾謂詞以安全處理空列表,例如:

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

計數,計算集合中有多少個項目,等於返回true。 您可能要使用size或傳遞項目進行計數。

編輯

除了您的編輯之外:
Bens解決方案很漂亮,但是您可以寫

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

也一樣 取決於上下文,這可能會使您的代碼更具可讀性。
您應該考慮使用其他東西,然后再使用教堂。 一個classcase class將使您的代碼比x._2._1.更具可讀性x._2._1.
如果要使用手風琴, case class通常是更好的解決方案。 您可以考慮一個case class例如一個命名的tupel。 它滿足相同的需求,但更具可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM