Получение значения столбца из объекта строки: кодировщик не найден - PullRequest
0 голосов
/ 29 октября 2019

Я написал следующий код для выполнения некоторых действий, основанных на значении поля для каждой строки:

import spark.implicits._ 
table.map(line =>
          column_names.map(column =>
                      if (line.getAs[Int](column)==0)
                          println("yes")
                      )
          )

Однако я сталкиваюсь со следующей ошибкой:

java.lang.UnsupportedOperationException: No Encoder found for Unit
- array element class: "scala.runtime.BoxedUnit"
- root class: "scala.collection.immutable.List"

Я понимаю, чтокодер требуется для преобразования объектов и примитивов в Spark InternalRow, но поле, к которому я пытаюсь получить доступ, содержит int, и, исходя из моего понимания, соответствующий кодер должен быть доступен благодаря spark.implicits ._.

Не могли бы вы сказать мне, что мне не хватает и что я должен сделать, чтобы это исправить?

1 Ответ

1 голос
/ 29 октября 2019

Проблема в том, что ваш оператор map возвращает Unit (т.е. ничего), для которого нет кодера. Если вы просто хотите напечатать, используйте вместо этого foreach:

table.foreach(line =>
  column_names.foreach(column =>
    if (line.getAs[Int](column)==0)
      println("yes")
  )
)

, в противном случае верните что-то (убедитесь, что вы также возвращаете тот же тип в предложении else, например,

table.map(line =>
  column_names.map(column =>
    if (line.getAs[Int](column)==0) {
      println("yes")
      "yes"
     } else {
       "no"
     }
  )
)
...