Tengo un tipo mixto dataframe.
Estoy leyendo esto dataframe de la colmena de la tabla utilizando
spark.sql('select a,b,c from table') comando.

Algunas columnas son de tipo int , bigint , doble y otros son de la cadena. Hay 32 columnas en total.
¿Hay alguna forma en pyspark para convertir todas las columnas de la estructura de datos de tipo string ?

InformationsquelleAutor user1411335 | 2017-02-07

3 Comentarios

  1. 19

    Sólo:

    from pyspark.sql.functions import col
    
    table = spark.sql("table")
    
    table.select([col(c).cast("string") for c in table.columns])
    • Este método tiene la ventaja de un rendimiento más withCcolumns cuando se trata con thounsands columnas con la versión 2.1.0
  2. 3

    Aquí una línea de solución en Scala :

    df.select(df.columns.map(c => col(c).cast(StringType)) : _*)
    

    Vamos a ver un ejemplo aquí :

    import org.apache.spark.sql._
    import org.apache.spark.sql.types._
    import org.apache.spark.sql.functions._
    val data = Seq(
       Row(1, "a"),
       Row(5, "z")
    )
    
    val schema = StructType(
      List(
        StructField("num", IntegerType, true),
        StructField("letter", StringType, true)
     )
    )
    
    val df = spark.createDataFrame(
      spark.sparkContext.parallelize(data),
      schema
    )
    
    df.printSchema
    //root
    //|-- num: integer (nullable = true)
    //|-- letter: string (nullable = true)
    
    val newDf = df.select(df.columns.map(c => col(c).cast(StringType)) : _*)
    
    newDf.printSchema
    //root
    //|-- num: string (nullable = true)
    //|-- letter: string (nullable = true)
    

    Espero te sirva de ayuda

  3. 1

    Para Scala, spark versión > 2.0

    case class Row(id: Int, value: Double)
    
    import spark.implicits._
    
    import org.apache.spark.sql.functions._
    
    val r1 = Seq(Row(1, 1.0), Row(2, 2.0), Row(3, 3.0)).toDF()
    
    r1.show
    +---+-----+
    | id|value|
    +---+-----+
    |  1|  1.0|
    |  2|  2.0|
    |  3|  3.0|
    +---+-----+
    
    val castedDF = r1.columns.foldLeft(r1)((current, c) => current.withColumn(c, col(c).cast("String")))
    
    castedDF.printSchema
    root
     |-- id: string (nullable = false)
     |-- value: string (nullable = false)
    

Dejar respuesta

Please enter your comment!
Please enter your name here