Pyspark.sql.utils.AnalysisException: столбец неоднозначен, но нет повторяющихся имен столбцов

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

Операция соединения, где a и input были обработаны другими функциями:

b = (
        input
        .where(F.col('st').like('%VALUE%'))
        .select('id', 'sii')
    )
a.join(b, b['id'] == a['item'])

Датафреймы:

(Pdb) a.explain()
== Physical Plan ==
*(1) Scan ExistingRDD[item#25280L,sii#24665L]

(Pdb) b.explain()
== Physical Plan ==
*(1) Project [id#23711L, sii#24665L]
+- *(1) Filter (isnotnull(st#25022) AND st#25022 LIKE %VALUE%)
   +- *(1) Scan ExistingRDD[id#23711L,st#25022,sii#24665L]

Исключение:

pyspark.sql.utils.AnalysisException: Column id#23711L are ambiguous. It's probably because you joined several Datasets together, and some of these Datasets are the same. This column points to one of the Datasets but Spark is unable to figure out which one. Please alias the Datasets with different names via Dataset.as before joining them, and specify the column using qualified name, e.g. df.as("a").join(df.as("b"), $"a.id" > $"b.id"). You can also set spark.sql.analyzer.failAmbiguousSelfJoin to false to disable this check.;

Если я воссоздаю фрейм данных, используя ту же схему, я не получаю никаких ошибок:

b_clean = spark_session.createDataFrame([], b.schema)
a.join(b_clean, b_clean['id'] == a['item'])

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

На физических планах видно, что оба фрейма данных содержат столбец sii

ZygD 23.04.2022 12:10

Ошибка связана со столбцом id#23711L в фрейме данных b. Если я воссоздам фрейм данных b с той же схемой, я смогу соединить два кадра данных без каких-либо ошибок.

user18914505 25.04.2022 05:14
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
2
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта ошибка и тот факт, что ваш столбец sii имеет одинаковый идентификатор в обеих таблицах (например, sii#24665L), говорит о том, что кадры данных a и b созданы с использованием одного и того же источника. Итак, по сути, это делает ваше соединение самостоятельно присоединиться (именно то, что говорит сообщение об ошибке). В таких случаях рекомендуется использовать alias для фреймов данных. Попробуй это:

a.alias('a').join(b.alias('b'), F.col('b.id') == F.col('a.item'))

Опять же, в некоторых системах вы не сможете сохранить результат, так как результирующий фрейм данных будет иметь 2 столбца sii. Я бы рекомендовал явно указывать select только те столбцы, которые вам нужны. Переименование столбцов с помощью alias также может помочь, если вы решите, что вам понадобятся оба повторяющихся столбца. Например.:

df = (
    a.alias('a').join(b.alias('b'), F.col('b.id') == F.col('a.item'))
    .select('item',
            'id',
            F.col('a.sii').alias('a_sii')
    )
)

Спасибо за понимание о самостоятельном присоединении! Теперь ошибка имеет гораздо больше смысла.

user18914505 26.04.2022 06:02

Другие вопросы по теме