tutorial spark examples example scala apache-spark apache-spark-sql spark-dataframe

scala - examples - spark sql example



Extraer valores de columna de Dataframe como Lista en Apache Spark (5)

Me gustaría convertir una columna de cadena de un marco de datos en una lista. Lo que puedo encontrar en el Dataframe API es RDD, así que intenté convertirlo de nuevo a RDD primero y luego aplicar la función de toArray al RDD. En este caso, la longitud y el SQL funcionan bien. Sin embargo, el resultado que obtuve de RDD tiene corchetes alrededor de cada elemento como este [A00001] . Me preguntaba si hay una forma adecuada de convertir una columna en una lista o una forma de eliminar los corchetes.

Cualquier sugerencia sera apreciada. ¡Gracias!


Con Spark 2.xy Scala 2.11

Pensaría en 3 formas posibles de convertir valores de una columna específica a Lista

Fragmentos de código comunes para todos los enfoques

import org.apache.spark.sql.SparkSession val spark = SparkSession.builder.getOrCreate import spark.implicits._ // for .toDf() method val df = Seq( ("first", 2.0), ("test", 1.5), ("choose", 8.0) ).toDF("id", "val")

Enfoque 1

df.select("id").collect().map(_(0)).toList // res9: List[Any] = List(one, two, three)

¿Que pasa ahora? Estamos recopilando datos para Driver con collect() y seleccionando el elemento cero de cada registro.

Esta no podría ser una excelente manera de hacerlo. Mejoremos con el próximo enfoque.

Enfoque 2

df.select("id").rdd.map(r => r(0)).collect.toList //res10: List[Any] = List(one, two, three)

Como es mejor Hemos distribuido la carga de transformación de mapas entre los trabajadores en lugar de un solo controlador.

Sé que rdd.map(r => r(0)) no te parece elegante. Entonces, abordemos el tema en el próximo enfoque.

Enfoque 3

df.select("id").map(r => r.getString(0)).collect.toList //res11: List[String] = List(one, two, three)

Aquí no estamos convirtiendo DataFrame a RDD. Mire el map , no aceptará r => r(0) (o _(0) ) como el enfoque anterior debido a problemas con el codificador en DataFrame. Así que termine usando r => r.getString(0) y se abordará en las próximas versiones de Spark.

Conclusión

Todas las opciones dan la misma salida, pero 2 y 3 son efectivas, finalmente la tercera es efectiva y elegante (creo).

Enlace del cuaderno Databricks que estará disponible hasta 6 meses a partir del 20/05/2017


En Scala y Spark 2+, intente esto (suponiendo que el nombre de su columna sea "s"): df.select(''s).as[String].collect


Esto debería devolver la colección que contiene una lista única:

dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()

Sin la asignación, solo obtiene un objeto Row, que contiene todas las columnas de la base de datos.

Tenga en cuenta que esto probablemente le dará una lista de cualquier tipo. Ï si desea especificar el tipo de resultado, puede usar .asInstanceOf [YOUR_TYPE] en r => r(0).asInstanceOf[YOUR_TYPE]

PD: debido a la conversión automática, puede omitir la parte .rdd .


Sé que la respuesta dada y solicitada se supone para Scala, por lo que solo estoy proporcionando un pequeño fragmento de código Python en caso de que un usuario de PySpark tenga curiosidad. La sintaxis es similar a la respuesta dada, pero para extraer la lista correctamente, tengo que hacer referencia al nombre de la columna por segunda vez en la función de mapeo y no necesito la instrucción select.

es decir, un DataFrame, que contiene una columna llamada "Raw"

Para obtener cada valor de fila en "Raw" combinado como una lista donde cada entrada es un valor de fila de "Raw" simplemente uso:

MyDataFrame.rdd.map(lambda x: x.Raw).collect()


sqlContext.sql(" select filename from tempTable").rdd.map(r => r(0)).collect.toList.foreach(out_streamfn.println) //remove brackets

funciona perfectamente