Spark-从Scala代码调用Java方法时不支持OperationException
我已经用Scala实现了代码,它使用的是Java编写的方法。 在下面的代码中,Spark-从Scala代码调用Java方法时不支持OperationException,java,scala,apache-spark,collections,Java,Scala,Apache Spark,Collections,我已经用Scala实现了代码,它使用的是Java编写的方法。 在下面的代码中,processSale()是一个Java方法,它将util.List作为参数 在Scala.collection.JavaConverters的帮助下,我将ScalaIterable[Sale]转换为Seq[Sale],然后转换为util.List。\u val parseSales: RDD[(String, Sale)] = rawSales .map(sale => sale.Id ->
processSale()
是一个Java方法,它将util.List
作为参数
在Scala.collection.JavaConverters的帮助下,我将ScalaIterable[Sale]
转换为Seq[Sale]
,然后转换为util.List
。\u
val parseSales: RDD[(String, Sale)] = rawSales
.map(sale => sale.Id -> sale)
.groupByKey()
.mapValues(a => SaleParser.processSale(a.toSeq.asJava))
但是,当代码作为Spark驱动程序的一部分执行时,由于任务失败,作业会失败,出现UnsupportedOperationException
。我查看了日志,发现原因似乎在Collections.sort调用的JavaprocessSale
方法中
Collections.sort(sales, new Comparator<InvocaCall>() {
@Override
public int compare(Sale sale1, Sale sale2) {
return Long.compare(sale1.timestamp, sale2.timestamp);
}
});
Collections.sort(销售、新比较器(){
@凌驾
公共整数比较(销售额1、销售额2){
返回Long.compare(sale1.timestamp,sale2.timestamp);
}
});
我被困在这一点上,因为我正在传递所需的
util.List
。为什么在这种情况下,Collections.sort
可能是不受支持的操作 为rawSales添加空检查util.List
为rawSales
util.List添加空检查
发件人:
因为Java不区分可变和不可变
类型中的集合,例如,
scala.immutable.List
将生成一个java.util.List
,其中
变异操作抛出一个不支持的操作异常
代码中的toSeq
返回immutable.Seq
,这就是为什么会出现异常
因此,您的列表是可变数据结构,如ListBuffer
:
list.to[scala.collection.mutable.ListBuffer].asJava
发件人:
因为Java不区分可变和不可变
类型中的集合,例如,
scala.immutable.List
将生成一个java.util.List
,其中
变异操作抛出一个不支持的操作异常
代码中的toSeq
返回immutable.Seq
,这就是为什么会出现异常
因此,您的列表是可变数据结构,如ListBuffer
:
list.to[scala.collection.mutable.ListBuffer].asJava
将“无”分配给RDD?@Duelist程序员将决定他们是否需要其他东西;否则没有。将“没有”分配给RDD?@Duelist程序员将决定他们是否需要其他东西;否则就没有了。