【问题标题】:scala - getting java.util.NoSuchElementExceptionscala - 获取 java.util.NoSuchElementException
【发布时间】:2016-02-27 16:09:49
【问题描述】:

获取 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,(一些(药物(000496120-01,Fri Jul 01 15:15:00 EDT 2005,硫酸鱼精蛋白)),一些(诊断(000496120-01,Mon Jan 07 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))

希望对你有帮助

【问题讨论】:

  • 除了你的问题,x._2._1 这看起来很可疑,就像不可读的代码/不好的做法。你可以阅读case classes。
  • 您需要提供更多上下文以获得更有意义的帮助。我所能收集到的只是它看起来像x._2._1 是一个空的List,因此在它上面调用.last 会引发错误。
  • 提供更多上下文

标签: scala


【解决方案1】:

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

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

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

【讨论】:

  • 添加了更多上下文 - 再次查看问题定义 - 您的建议可确保不再出现错误,但过滤器未正确发生
  • 你太棒了 - 我犯了一个编码错误 - 事实上你的建议有效 - 谢谢。
【解决方案2】:

Count,计算集合中有多少项目,因为等于返回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。它满足相同的需求,但更具可读性。

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 2015-05-30
    • 2017-07-11
    • 2020-01-22
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多