2016-02-26 71 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