Функция удаления не работает должным образом после объединения тех же столбцов Dataframe - PullRequest
0 голосов
/ 07 октября 2019

Я сталкиваюсь с той же проблемой, когда присоединяюсь к двум фреймам данных A, B.

Например:

c = df_a.join(df_b, [df_a.col1 == df_b.col1], how="left").drop(df_b.col1)

И когда я пытаюсь отбросить дублирующийся столбец, как указано выше в этом запросене удаляет столбец df_b. Вместо этого, когда я пытаюсь удалить col1 из df_a, он может удалить col1 из df_a.

Может кто-нибудь сказать об этом.

Примечание: я пытался сделать то же самое в моем проекте, который содержит более 200 столбцов и показывает ту же проблему. Иногда эта функция удаления работает правильно, если у нас есть несколько столбцов, но нет, если у нас есть больше столбцов.

Функция удаления не работает после левого внешнего соединения в pyspark

1 Ответ

0 голосов
/ 08 октября 2019

Есть некоторые похожие проблемы, с которыми я недавно столкнулся. Позвольте мне показать их ниже с вашим делом.

Я создаю два кадра данных с одинаковыми данными

scala> val df_a = Seq((1, 2, "as"), (2,3,"ds"), (3,4,"ew"), (4, 1, "re"), (3,1,"ht")).toDF("a", "b", "c")
df_a: org.apache.spark.sql.DataFrame = [a: int, b: int ... 1 more field]

scala> val df_b = Seq((1, 2, "as"), (2,3,"ds"), (3,4,"ew"), (4, 1, "re"), (3,1,"ht")).toDF("a", "b", "c")
df_b: org.apache.spark.sql.DataFrame = [a: int, b: int ... 1 more field]

Объединяя их

scala> val df = df_a.join(df_b, df_a("b") === df_b("a"), "leftouter")
df: org.apache.spark.sql.DataFrame = [a: int, b: int ... 4 more fields]

scala> df.show
+---+---+---+---+---+---+
|  a|  b|  c|  a|  b|  c|
+---+---+---+---+---+---+
|  1|  2| as|  2|  3| ds|
|  2|  3| ds|  3|  1| ht|
|  2|  3| ds|  3|  4| ew|
|  3|  4| ew|  4|  1| re|
|  4|  1| re|  1|  2| as|
|  3|  1| ht|  1|  2| as|
+---+---+---+---+---+---+

Давайте отбросим столбец, которыйотсутствует в приведенном выше фрейме данных

+---+---+---+---+---+---+
|  a|  b|  c|  a|  b|  c|
+---+---+---+---+---+---+
|  1|  2| as|  2|  3| ds|
|  2|  3| ds|  3|  1| ht|
|  2|  3| ds|  3|  4| ew|
|  3|  4| ew|  4|  1| re|
|  4|  1| re|  1|  2| as|
|  3|  1| ht|  1|  2| as|
+---+---+---+---+---+---+

В идеале мы ожидаем, что spark выдаст ошибку, но она выполнится успешно.

Теперь, если вы отбросите столбец из указанного выше фрейма данных

scala> df.drop("a").show
+---+---+---+---+
|  b|  c|  b|  c|
+---+---+---+---+
|  2| as|  3| ds|
|  3| ds|  1| ht|
|  3| ds|  4| ew|
|  4| ew|  1| re|
|  1| re|  2| as|
|  1| ht|  2| as|
+---+---+---+---+

Удаляет все столбцы с указанным именем столбца во входном фрейме данных.

Если вы хотите удалить определенные столбцы, это должно быть сделано следующим образом:

scala> df.drop(df_a("a")).show()
+---+---+---+---+---+
|  b|  c|  a|  b|  c|
+---+---+---+---+---+
|  2| as|  2|  3| ds|
|  3| ds|  3|  1| ht|
|  3| ds|  3|  4| ew|
|  4| ew|  4|  1| re|
|  1| re|  1|  2| as|
|  1| ht|  1|  2| as|
+---+---+---+---+---+

Я не думаю, что spark принимает ввод от вас (см. Ниже):


scala> df.drop(df_a.a).show()
<console>:30: error: value a is not a member of org.apache.spark.sql.DataFrame
       df.drop(df_a.a).show()
                    ^

scala> df.drop(df_a."a").show()
<console>:1: error: identifier expected but string literal found.
df.drop(df_a."a").show()
             ^

Если вы предоставите вход для отбрасывания, как показано ниже, он будет выполнен, но не окажет влияния

scala> df.drop("df_a.a").show
+---+---+---+---+---+---+
|  a|  b|  c|  a|  b|  c|
+---+---+---+---+---+---+
|  1|  2| as|  2|  3| ds|
|  2|  3| ds|  3|  1| ht|
|  2|  3| ds|  3|  4| ew|
|  3|  4| ew|  4|  1| re|
|  4|  1| re|  1|  2| as|
|  3|  1| ht|  1|  2| as|
+---+---+---+---+---+---+

Причина в том, что spark интерпретирует "df_a.a" как вложенный столбец. Поскольку этот столбец в идеале отсутствует, он должен выдать ошибку, но, как объяснено выше, он просто выполняется.

Надеюсь, это поможет .. !!!

...