Создайте столбец и используйте в качестве ключа соединения внутри СОЕДИНЕНИЯ в PySpark

#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')