Spark-从Scala代码调用Java方法时出现UnsupportedOperationException

时间:2018-10-11 10:57:18

标签: java scala apache-spark collections

我已经在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

调用的Java 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是不受支持的操作?

2 个答案:

答案 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)

来自this documentation

  

因为Java不能区分可变和不可变   其类型的集合,例如从   scala.immutable.List将产生java.util.List,其中所有   变异操作会抛出UnsupportedOperationException

代码中的

toSeq返回immutable.Seq,这就是为什么您会得到异常的原因。

因此you can convert将您的列表转换为ListBuffer这样的可变数据结构:

list.to[scala.collection.mutable.ListBuffer].asJava