scala - example - spark sql tutorial
¿Cómo cambiar la posición de una columna en un marco de datos de chispa? (4)
Como han comentado otros, tengo curiosidad por saber por qué haría esto, ya que el orden no es relevante cuando puede consultar las columnas por sus nombres.
De todos modos, usar una selección debería dar la sensación de que las columnas se han movido en la descripción del esquema:
val data = Seq(
("a", "hello", 1),
("b", "spark", 2)
)
.toDF("field1", "field2", "field3")
data
.show()
data
.select("field3", "field2", "field1")
.show()
Me preguntaba si es posible cambiar la posición de una columna en un marco de datos, ¿en realidad cambiar el esquema?
Precisamente si tengo un marco de datos como [field1, field2, field3], y me gustaría obtener [field1, field3, field2].
Cualquier ayuda sería muy apreciada!
Gracias.
Editar:
No puedo poner ningún trozo de código. Imaginemos que estamos trabajando con un marco de datos con cien columnas, después de algunas uniones y transformaciones, algunas de estas columnas están mal ubicadas con respecto al esquema de la tabla de destino. Así que mi punto es: ¿cómo mover una o varias columnas, es decir, cómo cambiar el esquema?
Gracias.
La biblioteca spark-daria tiene un método reorderColumns
que facilita la reordenación de las columnas en un DataFrame.
import com.github.mrpowers.spark.daria.sql.DataFrameExt._
val actualDF = sourceDF.reorderColumns(
Seq("field1", "field3", "field2")
)
El método reorderColumns
utiliza la solución de @Rockie Yang bajo el capó.
Si desea obtener el orden de las columnas de df1
para igualar el orden de las columnas de df2
, algo como esto debería funcionar mejor que codificar todas las columnas:
df1.reorderColumns(df2.columns)
La biblioteca spark-daria también define una transformación sortColumns
para ordenar las columnas en orden ascendente o descendente (si no desea especificar todas las columnas en una secuencia).
import com.github.mrpowers.spark.daria.sql.transformations._
df.transform(sortColumns("asc"))
Puede obtener los nombres de las columnas, reordenarlos como desee y luego usar select
en el DataFrame original para obtener uno nuevo con este nuevo pedido:
val columns: Array[String] = dataFrame.columns
val reorderedColumnNames: Array[String] = ??? // do the reordering you want
val result: DataFrame = dataFrame.select(reorderedColumnNames.head, reorderedColumnNames.tail: _*)
Una versión muy pequeña en comparación con @Tzach Zohar
val cols = df.columns.map(df(_)).reverse
val reversedColDF = df.select(cols:_*)