pyspark оставляет соединение только с первой записью

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