我已经在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
任务失败而导致作业失败。我查看了日志,似乎原因是在Collections.sort
processSale
方法中
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
是不受支持的操作?
答案 0 :(得分:1)
为rawSales util.List<Sale>
添加空检查。
val parseSales: RDD[(String, Sale)] = if (rawSales.nonEmpty)
//rawSales specific stream operations
else
//None or any code as per requirement
答案 1 :(得分:1)
代码中的因为Java不能区分可变和不可变 其类型的集合,例如从
scala.immutable.List
将产生java.util.List
,其中所有 变异操作会抛出UnsupportedOperationException
toSeq
返回immutable.Seq
,这就是为什么您会得到异常的原因。
因此you can convert将您的列表转换为ListBuffer
这样的可变数据结构:
list.to[scala.collection.mutable.ListBuffer].asJava