Escribí el siguiente código para realizar alguna acción basada en un valor de campo para cada fila:

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

Sin embargo, encuentro el siguiente error:

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

Entiendo que se requiere un codificador para convertir objetos y primitivas en Spark InternalRow, pero el campo al que intento acceder contiene un int, y según mi entendimiento, el codificador correspondiente debería estar disponible gracias a spark.implicits._.

¿Podría decirme qué me falta y qué debo hacer para solucionarlo?

0
mobupu 29 oct. 2019 a las 20:58

1 respuesta

La mejor respuesta

El problema es que su declaración de mapa devuelve Unit (es decir, nada), para lo cual no hay codificador. Si solo desea imprimir, utilice foreach en su lugar:

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

De lo contrario, devuelva algo (asegúrese de que también devuelve el mismo tipo en la cláusula else, p. ej.

table.map(line =>
  column_names.map(column =>
    if (line.getAs[Int](column)==0) {
      println("yes")
      "yes"
     } else {
       "no"
     }
  )
)
1
Raphael Roth 29 oct. 2019 a las 19:12