Spark - Как избежать дублирования столбцов после объединения? - PullRequest
0 голосов
/ 03 июля 2018

Расширение на случай использования, указанный здесь: Как избежать дублирования столбцов после объединения?

У меня есть два кадра данных с сотнями столбцов. Ниже приведены некоторые примеры со столбцами соединения:

df1.columns
//  Array(ts, id, X1, X2, ...)

и

df2.columns
//  Array(ts, id, X1, Y2, ...)

После того как я сделаю:

val df_combined = df1.join(df2, df1.X1===df2.X1 and df1.X2==df2.Y2)

Я получаю следующие столбцы: Array(ts, id, X1, X2, ts, id, X1, Y2). X1 дублируется.

Я не могу использовать join(right: Dataset[_], usingColumns: Seq[String]) api, так как для использования этого API все столбцы должны быть в обоих фреймах данных, что здесь не так (X2 и Y2). Единственный вариант, который я вижу, - это переименовать столбец и удалить столбец позже или создать псевдоним датафрейма и удалить столбец позже из 2-го кадра данных. Разве нет простого API для этого? Например. автоматически отбрасывать один из столбцов соединения в случае равенства соединения.

1 Ответ

0 голосов
/ 03 июля 2018

Как вы заметили, лучший способ избежать дублирования столбцов - использовать Seq[String] в качестве входных данных для join. Однако, поскольку столбцы имеют разные имена в кадрах данных, есть только два варианта:

  1. Переименуйте столбец Y2 в X2 и выполните join как df1.join(df2, Seq("X1", "X2")). Если вы хотите сохранить оба столбца Y2 и X2 впоследствии, просто скопируйте X2 в новый столбец Y2.

  2. Выполните join как прежде и drop нежелательные дублированные столбцы после:

    df1.join(df2, df1.col("X1") === df2.col("X1") and df1.col("X2") === df2.col("Y2"))
      .drop(df1.col("X1"))
    

К сожалению, в настоящее время не существует автоматического способа добиться этого.


При объединении фреймов данных лучше убедиться, что они не имеют одинаковые имена столбцов (за исключением столбцов, используемых в join). Например, столбцы ts и id выше. Если столбцов много, бывает трудно переименовать их все вручную. Чтобы сделать это автоматически, можно использовать следующий код:

val prefix "df1_"
val cols = df1.columns.map(c => col(c).as(s"$prefix$c"))
df1.select(cols:_*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...