Cómo convertir una columna de la que ha sido leído como una cadena, en una columna de las matrices?
es decir, convertir a partir del siguiente esquema

scala> test.printSchema
root
 |-- a: long (nullable = true)
 |-- b: string (nullable = true)

+---+---+
|  a|  b|
+---+---+
|  1|2,3|
+---+---+
|  2|4,5|
+---+---+

A:

scala> test1.printSchema
root
 |-- a: long (nullable = true)
 |-- b: array (nullable = true)
 |    |-- element: long (containsNull = true)

+---+-----+
|  a|  b  |
+---+-----+
|  1|[2,3]|
+---+-----+
|  2|[4,5]|
+---+-----+

Por favor compartir tanto la scala y la implementación de python, si es posible.
En una nota relacionada, ¿cómo tomar el cuidado de él durante la lectura del archivo?
Tengo los datos de con ~450 columnas y algunos de ellos quiero especificar en este formato.
Actualmente estoy leyendo en pyspark de la siguiente manera:

df = spark.read.format('com.databricks.spark.csv').options(
    header='true', inferschema='true', delimiter='|').load(input_file)

Gracias.

InformationsquelleAutor Nikhil Utane | 2017-06-22

3 Comentarios

  1. 11

    Hay varias método,

    La mejor manera de hacerlo es utilizando split función y echó a array<long>

    data.withColumn("b", split(col("b"), ",").cast("array<long>"))

    También puede crear una simple udf para convertir los valores

    val tolong = udf((value : String) => value.split(",").map(_.toLong))
    
    data.withColumn("newB", tolong(data("b"))).show

    Espero que esto ayude!

    • Este enfoque parece (no más) de trabajo.
    • Creo que te refieres col(«b»), no a los datos(«b»)
  2. 2

    El uso de un UDF a dar necesaria exacta del esquema. Como este:

    val toArray = udf((b: String) => b.split(",").map(_.toLong))
    
    val test1 = test.withColumn("b", toArray(col("b")))

    Se le dará a usted el esquema de la siguiente manera:

    scala> test1.printSchema
    root
     |-- a: long (nullable = true)
     |-- b: array (nullable = true)
     |    |-- element: long (containsNull = true)
    
    +---+-----+
    |  a|  b  |
    +---+-----+
    |  1|[2,3]|
    +---+-----+
    |  2|[4,5]|
    +---+-----+

    Tan lejos como la aplicación de esquema en el archivo de lectura en sí se refiere, creo que es una tarea difícil. Así que, por ahora se puede aplicar la transformación después de la creación de DataFrameReader de test.

    Espero que esto ayude!

  3. 0

    En python (pyspark) sería:

    from pyspark.sql.types import *
    from pyspark.sql.functions import col, split
    test = test.withColumn(
            "b",
            split(col("b"), ",\s*").cast("array<int>").alias("ev")
     )

Dejar respuesta

Please enter your comment!
Please enter your name here