带有空正则表达式结果的DF.filter返回nosuchElement异常

时间:2018-09-25 14:59:15

标签: scala apache-spark

像这样将正则表达式应用于数据框:

val match2 = df.filter($"cityid" rlike "[^0-9]").first

如果发现任何内容,此行代码就可以了,但是如果什么也没找到,则会产生类似这样的错误:

java.util.NoSuchElementException: next on empty iterator

我该如何解决?不确定选项是否可行。

1 个答案:

答案 0 :(得分:0)

我不确定数据帧的行为,但是在普通的Scala中,直接使用head方法是一个潜在的问题,例如,当结果列表为空时,将引发类似您发布的列表的异常。 我建议更改为headOption,然后对Option monad进行操作。 希望能有所帮助。 干杯

编辑: 由于DataFrame(DataSet [T])不能很好地处理headOption类似操作,因此我提出了以下解决方案:

implicit class DataSetOps(myDataSet: Dataset[T]) {
  def headOption: Option[T] = {
    myDataSet.count match {
      case size if size > 0 => Option(myDataSet.first)
      case _ => None
    }
  }
}

然后,您可以做类似的事情

val myFirstElementAsOpt: Option[T] = myDataSet.headOption