#apache-spark #pyspark #apache-spark-sql
Вопрос:
Я хотел бы создать столбец для использования в качестве ключа соединения внутри соединения, например:
df1.join(df2
.withColumn('NewDF2Column', SOME_OPERATION)),
df1['key'] = df2['NewDF2Column'], how = 'left'))
PySpark никогда не сможет найти столбец newdf2 для использования в качестве ключа соединения. Это работает, если я сначала создам его в другом фрейме данных, но не динамически, как это. Возможно ли это? Спасибо!
Ответ №1:
Фреймы данных неизменяемы, а это значит, что вам нужно каждый раз переназначать свою переменную, чтобы получить из нее результат. В этом случае вы создаете свой NewDF2Column
первый параметр join
операции, но второй параметр, на который вы NewDF2Column
снова ссылаетесь, не может видеть изменения, внесенные ранее. Как это решить?
Первый вариант
# Creating before joining
df2 = df2.withColumn('NewDF2Column', SOME_OPERATION)
output_df = df1.join(df2, df1['key'] = df2['NewDF2Column'], how='left')
Второй вариант
# Creating a column to join with the same name as df1
output_df = df1.join(df2.withColumn('key', SOME_OPERATION), on='key', how='left')
Комментарии:
1. Я должен был упомянуть, что у меня есть несколько столбцов объединения. Оба варианта отлично работают, если я подключусь к ключу, но как только я попытаюсь добавить дополнительные столбцы, т. Е. (df1[‘ключ’] = df2[‘ключ’]) amp; (df1[‘ключ’] = df2[‘ключ’]), он все равно не сможет найти «ключ». Есть какие — нибудь мысли о соединении нескольких ключей по одному и тому же сценарию?
2. Конечно, вы должны передать массив строк, например
df1.join(df2, on=['key', 'keyB'], how='left')