Spark - UnsupportedOperationException при вызове метода Java из кода Scala - PullRequest
0 голосов
/ 11 октября 2018

Я реализовал код в 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 driver задание не выполняется из-за сбоя задания с 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 может быть неподдерживаемой операцией в этом случае?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Из этой документации :

Поскольку Java не различает изменяемые и неизменяемые коллекции по их типу, преобразование, скажем, scala.immutable.List даст java.util.List, где все операции мутации выдают UnsupportedOperationException

toSeq из вашего кода, возвращает immutable.Seq, поэтому вы получаете исключение.

Так что вы можетепреобразовать ваш список в изменяемую структуру данных, такую ​​как ListBuffer:

list.to[scala.collection.mutable.ListBuffer].asJava
0 голосов
/ 11 октября 2018

Добавить нулевую проверку для rawSales util.List<Sale>.

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