【问题标题】:Spark - UnsupportedOperationException when calling Java method from Scala codeSpark - 从 Scala 代码调用 Java 方法时出现 UnsupportedOperationException
【发布时间】:2018-10-11 10:57:18
【问题描述】:

我在 Scala 中实现了使用 Java 编写的方法的代码。 在下面的代码中,processSale() 是一个以util.List<Sale> 为参数的 Java 方法。

scala.collection.JavaConverters._ 的帮助下,我已将 Scala Iterable[Sale] 转换为 Seq[Sale],然后转换为 util.List<Sale>

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&lt;Sale&gt;。为什么Collections.sort 在这种情况下会成为不受支持的操作?

【问题讨论】:

    标签: java scala apache-spark collections


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      为 rawSales util.List&lt;Sale&gt; 添加空检查。

         val parseSales: RDD[(String, Sale)] = if (rawSales.nonEmpty) 
                 //rawSales specific stream operations
                else
                 //None or any code as per requirement 
      

      【讨论】:

      • 为 RDD 分配无?
      • @Duelist 程序员会决定他们是否想要其他东西;否则无。
      猜你喜欢
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2019-02-27
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多