Tarea no serializable al mover simple función de UDF

votos
1

Estoy tratando de separar las funciones de la UDF de escribir pruebas, sin embargo, esto está causando errores de tipo serialización? Me trató diferentes formatos de creación de UDF pero su aún no funciona.

¿Por qué funciona esto?

   protected val normalizeDomain = udf {(dealer_url: String) => 
     var domain = if (dealer_url.startsWith(http://) || dealer_url.startsWith(https://)) dealer_url else shttp://$dealer_url
     domain = new URL(domain).getHost
     if (domain.startsWith(www.)) domain.replace(www., ) else domain
   }

Pero no esto?

  def normalizeDomainDef(dealer_url: String):String = {
    var domain = if (dealer_url.startsWith(http://) || dealer_url.startsWith(https://)) dealer_url else shttp://$dealer_url
    domain = new URL(domain).getHost
    if (domain.startsWith(www.)) domain.replace(www., ) else domain
  }
  val normalizeDomain = udf[String, String](normalizeDomainDef)

Al hacer este último me sale:

Caused by: java.io.NotSerializableException: line9e1150bafcc941e3b83a5f4ad173d2ae122.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$DealerVDPUrlMaker$
Serialization stack:
    - object not serializable (class: line9e1150bafcc941e3b83a5f4ad173d2ae122.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$DealerVDPUrlMaker$, value: line9e1150bafcc941e3b83a5f4ad173d2ae122.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$DealerVDPUrlMaker$@131552b)
    - field (class: line9e1150bafcc941e3b83a5f4ad173d2ae122.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$DealerVDPUrlMaker$$anonfun$3, name: $outer, type: class line9e1150bafcc941e3b83a5f4ad173d2ae122.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$DealerVDPUrlMaker$)
    - object (class line9e1150bafcc941e3b83a5f4ad173d2ae122.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$DealerVDPUrlMaker$$anonfun$3, <function1>)
    - element of array (index: 4)
    - array (class [Ljava.lang.Object;, size 5)
    - field (class: org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10, name: references$1, type: class [Ljava.lang.Object;)
Publicado el 27/11/2018 a las 16:59
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Lo más probable es el problema radica en el hecho en que sus normalizeDomainDefmentiras. Cuando se utiliza def, significa que pones en alguna clase y ahora toda la instancia de esa clase debe ser serializado para llamar a ese método y, probablemente, que la clase incluye una gran cantidad de no cosas serializable. Para solucionarlo trate de poner la función en un alto nivel independiente de objectla siguiente manera:

// top level object
object MyUdfs {
  def normalizeDomainDef(dealer_url: String):String = {
    var domain = if (dealer_url.startsWith("http://") || dealer_url.startsWith("https://")) dealer_url else s"http://$dealer_url"
    domain = new URL(domain).getHost
    if (domain.startsWith("www.")) domain.replace("www.", "") else domain
  }

  val normalizeDomain = udf[String, String](normalizeDomainDef)
}
Respondida el 28/11/2018 a las 03:12
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more