es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el tipo de dato Varchar no funciona en un DataFrame de Spark?

En realidad tengo un esquema como este:

val schema_tmp = Seq(StructField("Nombre", VarcharType(255), true), StructField("Id", VarcharType(255), true), StructField("Contacto", VarcharType(255), true), StructField("Es_Activo", CharType(10), true))

Mi archivo fuente es así:
Puedes hacer clic en este enlace para ver una captura de pantalla de mi archivo fuente: Por favor haz clic aquí para ver una captura de pantalla de mi archivo fuente

Al crear el dataframe, obtengo el siguiente resultado:

scala> val c = spark.read.format("csv").schema(StructType(schema_tmp)).option("header","false").load("sample2.txt")
scala.MatchError: VarcharType(255) (de la clase org.apache.spark.sql.types.VarcharType)
  at org.apache.spark.sql.catalyst.encoders.RowEncoder$.externalDataTypeFor(RowEncoder.scala:215)
  at org.apache.spark.sql.catalyst.encoders.RowEncoder$.externalDataTypeForInput(RowEncoder.scala:212)
  at org.apache.spark.sql.catalyst.expressions.objects.ValidateExternalType.<init>(objects.scala:1699)
  at org.apache.spark.sql.catalyst.encoders.RowEncoder$.serializerFor(RowEncoder.scala:175)
  at scala.collection.TraversableLike.flatMap(TraversableLike.scala:245)
  at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)

¿Alguien sabe qué significa este error? ¿Se admite el tipo varchar o no?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error es causado por el uso de VarcharType(255) en la definición del esquema. Este tipo no es compatible con Apache Spark. En su lugar, puedes usar StringType que proporciona soporte para cadenas de caracteres de longitud variable.

    Por lo tanto, para corregir el error, cambia la definición del esquema de:

    val schema_tmp=Seq(
     StructField("Nombre",VarcharType(255),true),
     StructField("Id",VarcharType(255),true),
     StructField("Contacto",VarcharType(255),true),
     StructField("Es_Activo",CharType(10),true)
    )
    

    A:

    val schema_tmp=Seq(
     StructField("Nombre",StringType,true),
     StructField("Id",StringType,true),
     StructField("Contacto",StringType,true),
     StructField("Es_Activo",StringType,true)
    )
    

    Esto debería solucionar el problema y permitirte crear el data frame usando el esquema especificado.

Comments are closed.