今天,我注意到Scala对于其自己的Set类型与其包装后的集合(至少是SetWrapper)具有不同的行为。我有一个利用现有Java代码在Java Set上执行简单“包含”的应用程序。因此,当从Scala调用时,我正在使用scala.collection.JavaConverters来获取将Java集合传递给此函数(SetWrapper)所必需的隐式。但是,正在检查集合中是否存在的值可以是Java null。似乎将空值传递给SetWrapper.contains方法会导致NPE。这是来自SetWrapper.contains的令人讨厌的代码段:
override def contains(o: Object): Boolean = {
try { underlying.contains(o.asInstanceOf[A]) }
catch { case cce: ClassCastException => false }
}
似乎asInstanceOf调用正在引起NPE。如果使用Scala,我的版本为2.11.8。有谁知道在更高版本中是否已解决此问题?我没有找到与此问题有关的任何参考。
***更多信息
广播SetWrapper时,Spark节点上发生错误。如果发送了“本机” Scala集,并且在节点上调用了“ asJava”方法,则不会有问题。显然,SetWrapper在网络上广播底层Scala集时不会将其序列化,最终在目标节点上为null。