Saltar al contenido

¿Cómo cambiar el nombre de las columnas duplicadas después de unirse?

Solución:

Quiero usar unirme con 3 marcos de datos, pero hay algunas columnas que no necesitamos o tenemos un nombre duplicado con otros marcos de datos

Ese es un buen caso de uso para crear un alias en un conjunto de datos usando alias o as operadores.

alias (alias: String): conjunto de datos[T] o alias (alias: símbolo): conjunto de datos[T]

Devuelve un nuevo conjunto de datos con un conjunto de alias. Igual que.

como (alias: String): conjunto de datos[T] o como (alias: símbolo): conjunto de datos[T]

Devuelve un nuevo conjunto de datos con un conjunto de alias.

(Y honestamente, solo ahora vi el Symbolvariantes basadas en.)

NOTA Hay dos as operadores, as para aliasing y as para mapeo de tipos. Consulta la API del conjunto de datos.

Una vez que haya asignado un alias a un conjunto de datos, puede hacer referencia a columnas usando [alias].[columnName] formato. Esto es particularmente útil con combinaciones y desreferenciación de columna de estrella utilizando *.

val ds1 = spark.range(5)
scala> ds1.as('one).select($"one.*").show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

val ds2 = spark.range(10)
// Using joins with aliased datasets
// where clause is in a longer form to demo how ot reference columns by alias
scala> ds1.as('one).join(ds2.as('two)).where($"one.id" === $"two.id").show
+---+---+
| id| id|
+---+---+
|  0|  0|
|  1|  1|
|  2|  2|
|  3|  3|
|  4|  4|
+---+---+

así que quiero soltar algunas columnas como a continuación

Mi recomendación general es no drop columnas, pero select lo que desea incluir en el resultado. Eso hace que la vida sea más predecible ya que sabes lo que obtienes (no lo que no obtienes). Me dijeron que nuestros cerebros funcionan con aspectos positivos, lo que también podría ser un punto para select.

Entonces, como preguntaste y mostré en el ejemplo anterior, el resultado tiene dos columnas con el mismo nombre id. La pregunta es cómo tener solo uno.

Hay al menos dos respuestas con el uso de la variante de join operador con las columnas de unión o la condición incluidas (como mostró en su pregunta), pero eso no respondería a su pregunta real sobre “eliminar columnas no deseadas”, ¿verdad?

Dado que prefiero select (sobre drop), Haría lo siguiente para tener una id columna:

val q = ds1.as('one)
  .join(ds2.as('two))
  .where($"one.id" === $"two.id")
  .select("one.*") // <-- select columns from "one" dataset
scala> q.show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

Independientemente de las razones por las que hizo la pregunta (que también podría responderse con los puntos que planteé anteriormente), permítame responder la pregunta (candente) de cómo usar withColumnRenamed cuando hay dos columnas coincidentes (después join).

Supongamos que terminó con la siguiente consulta y, por lo tanto, tiene dos id columnas (por lado de unión).

val q = ds1.as('one)
  .join(ds2.as('two))
  .where($"one.id" === $"two.id")
scala> q.show
+---+---+
| id| id|
+---+---+
|  0|  0|
|  1|  1|
|  2|  2|
|  3|  3|
|  4|  4|
+---+---+

withColumnRenamed no funcionará para este caso de uso, ya que no acepta nombres de columna con alias.

scala> q.withColumnRenamed("one.id", "one_id").show
+---+---+
| id| id|
+---+---+
|  0|  0|
|  1|  1|
|  2|  2|
|  3|  3|
|  4|  4|
+---+---+

Tú podrías select las columnas que le interesan de la siguiente manera:

scala> q.select("one.id").show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

scala> q.select("two.*").show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

Si está intentando cambiar el nombre del status columna de bb_df marco de datos, entonces puede hacerlo mientras se une como

result_df = aa_df.join(bb_df.withColumnRenamed('status', 'user_status'),'id', 'left').join(cc_df, 'id', 'left')
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *