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

标签 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 。我查看了日志,看来原因是在 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在这种情况下是不受支持的操作吗?

最佳答案

来自this documentation :

Because Java does not distinguish between mutable and immutable collections in their type, a conversion from, say, scala.immutable.List will yield a java.util.List, where all mutation operations throw an UnsupportedOperationException

您的代码中的

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/

相关文章:

java - Java 14 记录文档中 "shallowly immutable"的含义

java - 如何形成一个正则表达式来识别变量名的正确声明

json - 如何使用嵌套 case 类并喷射 json 隐式

apache-spark - Spark 写入 postgres 很慢

apache-spark - Spark 2.3+ 使用 parquet.enable.dictionary?

java - 日历在 Calendar.add() 之后返回错误的毫秒数

Java正则表达式模式匹配

java - 如何将带有泛型的 java 构建器编写为 scala?

scala - 如何对两个数据帧中的列进行分组,然后在行之间应用聚合差异函数?

scala spark UDF 过滤器数组结构