#apache-spark #join #pyspark #apache-spark-sql
#apache-spark #Присоединиться #pyspark #apache-spark-sql
Вопрос:
У меня есть 2 фрейма данных pysaprk.
Я ищу возможность объединить df1 с df2. Левое соединение только с первой строкой из df2.
df1:
ID string
1 sfafsda
2 trwe
3 gfdgsd
df2
ID address state
1 Montreal Quebec
1 Quebec Quebec
2 Trichy TN
2 Madurai TN
3 Bangalore KN
3 Mysore KN
3 Hosur KN
Ожидаемый результат от соединения:
ID string address state
1 sfafsda Montreal Quebec
2 trwe Trichy TN
3 gfdgsd Bangalore KN
Поскольку я работаю над блоками данных, пожалуйста, дайте мне знать, проще ли реализовать pyspark left join только с первой строкой или возможно sql join для достижения ожидаемого результата. Спасибо.
Ответ №1:
Да, это возможно с помощью pyspark, но вам нужно добавить столбец индекса df2
. Смотрите код ниже:
df2 = df2.withColumn('index', F.monotonically_increasing_id())
df1.join(df2, 'ID', 'left')
.select('*', F.first(F.array('address', 'state')).over(Window.partitionBy('ID').orderBy('index')).alias('array'))
.select('ID', 'string', F.col('array')[0].alias('address'), F.col('array')[1].alias('state'))
.groupBy('ID', 'string')
.agg(F.first('address'), F.first('state'))
.orderBy('ID')