Вы можете добиться этого, отключив фрейм данных, затем соединив оба фрейма данных, а затем развернув результирующий фрейм данных
df1 = spark.createDataFrame([('Tom','English'),
('Tom','Mathematics'),
('Lily','English'),
('Lily','Chinese')],['Name','Course'])
df2 = spark.createDataFrame([('Tom',78,0,90),('Lily',85,88,0)],['Name','English','Chinese','Mathematics'])
df3 = df2.select('Name', expr('''stack(3,'English',English,'Chinese',Chinese,'Mathematics',Mathematics) as (Course, score)'''))
df4 = df3.join(df1, (df1.Name==df3.Name) & (df1.Course==df3.Course), 'inner').select(df1.Name,df1.Course,df3.score).\
groupBy('Name').pivot('Course').agg(min('score'))
df4.show()
+----+-------+-------+-----------+
|Name|Chinese|English|Mathematics|
+----+-------+-------+-----------+
| Tom| null| 78| 90|
|Lily| 88| 85| null|
+----+-------+-------+-----------+