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 Symbol
variantes 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')