Другой подход:
Просто обратите внимание, что может быть немного медленным Поскольку мы оцениваем один и тот же набор данных дважды (сначала для определения максимальной длины, а затем для получения окончательного набора данных с использованием максимальной длины)
import pyspark.sql.functions as f
df = df1.join(df2, [df1.id == df2.client_id], 'left_outer').groupBy(df1['id'],'Name').agg(f.collect_list('vehicle').alias('vehicle'))
df.show()
+---+----+------------------+
| id|Name| vehicle|
+---+----+------------------+
| 1|John| [car1]|
| 3|Ella| []|
| 2|Bob |[car3, car4, car2]|
| 4|Jim | []|
+---+----+------------------+
Найти максимальную длину для всех транспортных средств и получить окончательный набор данных
max_len = df.select(f.max(f.size('vehicle')).alias('max')).first()['max']
df.select('id', 'Name', *[df.vehicle[x] for x in range(max_len)]).show()
+---+----+----------+----------+----------+
| id|Name|vehicle[0]|vehicle[1]|vehicle[2]|
+---+----+----------+----------+----------+
| 1|John| car1| null| null|
| 3|Ella| null| null| null|
| 2|Bob | car2| car3| car4|
| 4|Jim | null| null| null|
+---+----+----------+----------+----------+