Функция удаления не работает после левого внешнего соединения в pyspark - PullRequest
0 голосов
/ 11 февраля 2019

Моя версия pyspark - 2.1.1.Я пытаюсь объединить два кадра данных (слева), имеющих два столбца id и priority .Я создаю свои фреймы данных следующим образом:

a = "select 123 as id, 1 as priority"
a_df = spark.sql(a)

b = "select 123 as id, 1 as priority union select 112 as uid, 1 as priority"
b_df = spark.sql(b)

c_df = a_df.join(b_df, (a_df.id==b_df.id), 'left').drop(b_df.priority)

c_df схема приходит как DataFrame[uid: int, priority: int, uid: int, priority: int]

Функция удаления не удаляет столбцы.

Но если я попытаюсь сделать:

c_df = a_df.join(b_df, (a_df.id==b_df.id), 'left').drop(a_df.priority)

Тогда столбец приоритета для a_df будет удален.

Не уверен, если есть проблема с изменением версии или что-то еще, нокажется очень странным, что функция отбрасывания будет вести себя так.

Я знаю, что обходной путь может заключаться в том, чтобы сначала удалить ненужные столбцы, а затем выполнить объединение.Но все еще не уверен, почему функция сброса не работает?

Заранее спасибо.

1 Ответ

0 голосов
/ 12 февраля 2019

Двойные имена столбцов с объединениями в pyspark приводят к непредсказуемому поведению, и я прочитал, чтобы устранить неоднозначность имен перед объединением.По стеку Spark Dataframe различает столбцы с повторяющимися именами и Pyspark Join, а затем выбор столбца показывает неожиданный вывод .Мне жаль говорить, что я не могу найти , почему pyspark не работает, как вы описали.

Но документация по базам данных решает эту проблему: https://docs.databricks.com/spark/latest/faq/join-two-dataframes-duplicated-column.html

Из блоков данных:

Если вы выполняете объединение в Spark и не указываете его правильно, вы получите повторяющиеся имена столбцов.Это затрудняет выбор этих столбцов.Эта тема и блокнот демонстрируют, как выполнить объединение, чтобы у вас не было дублированных столбцов.

Когда вы присоединяетесь, вместо этого вы можете попробовать либо использовать alias (это обычно то, что я использую),или вы можете присоединиться к столбцам типа list или str.

df = left.join(right, ["priority"]) 
...