Spark:总结包含None和Some()的列表?

sta*_*010 5 scala apache-spark

我已经明白,我可以轻松地使用List.sum以下列表:

var mylist = List(1,2,3,4,5)

mylist.sum
// res387: Int = 15
Run Code Online (Sandbox Code Playgroud)

但是,我有一个包含None和的元素的列表Some(1).这些值是在运行左外连接后生成的.

现在,当我尝试运行时List.sum,我收到一个错误:

var mylist= List(Some(0), None, Some(0), Some(0), Some(1))

mylist.sum
<console>:27: error: could not find implicit value for parameter num: Numeric[Option[Int]]
       mylist.sum
              ^
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我可以以某种方式将NoneSome值转换为整数,也许就在左外连接之后?

Psi*_*dom 9

您可以使用List.collect模式匹配方法:

mylist.collect{ case Some(x) => x }.sum
// res9: Int = 1
Run Code Online (Sandbox Code Playgroud)

这忽略了None元素.


另一种选择是使用getOrElseOption提取值,在这里你可以选择你要替换什么价值None有:

mylist.map(_.getOrElse(0)).sum
// res10: Int = 1
Run Code Online (Sandbox Code Playgroud)


Vid*_*dya 7

我发现处理集合的最简单方法Option[A]flatten:

val myList = List(Some(0), None, Some(0), Some(0), Some(1))
myList.flatten.sum
Run Code Online (Sandbox Code Playgroud)

调用flatten将删除所有None值并将剩余的值Some[Int]变为普通旧 - Int最后留给你一个集合Int.

顺便说一句,拥抱不变性是Scala一流的公民,更喜欢valvar.