我已经在 Scala 中实现了使用 Java 编写的方法的代码。
在下面的代码中processSale()
是一个 Java 方法,它需要 util.List<Sale>
作为参数。
我已经转换了 Scala Iterable[Sale]
至Seq[Sale]
然后到util.List<Sale>
在scala.collection.JavaConverters._
的帮助下
val parseSales: RDD[(String, Sale)] = rawSales
.map(sale => sale.Id -> sale)
.groupByKey()
.mapValues(a => SaleParser.processSale(a.toSeq.asJava))
但是,当代码作为 Spark 驱动程序的一部分执行时,作业会由于任务失败而失败 UnsupportedOperationException
。我查看了日志,看来原因是在 Java processSale
中调用 Collections.sort 的方法
Collections.sort(sales, new Comparator<InvocaCall>() {
@Override
public int compare(Sale sale1, Sale sale2) {
return Long.compare(sale1.timestamp, sale2.timestamp);
}
});
我现在陷入困境,因为我正在通过所需的 util.List<Sale>
。为什么可以Collections.sort
在这种情况下是不受支持的操作吗?
最佳答案
您的代码中的Because Java does not distinguish between mutable and immutable collections in their type, a conversion from, say,
scala.immutable.List
will yield ajava.util.List
, where all mutation operations throw anUnsupportedOperationException
toSeq
返回 immutable.Seq
,这就是您收到异常的原因。
所以you can convert您的列表为可变数据结构,例如 ListBuffer
:
list.to[scala.collection.mutable.ListBuffer].asJava
关于java - Spark - 从 Scala 代码调用 Java 方法时出现 UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52758357/