Попробуйте с функциями arrays_zip and explode
.
Example:
df.show()
#+---+---+---+---+
#| p| a| b| c|
#+---+---+---+---+
#| p1| 2| 2| 1|
#| p2| 4| 3| 2|
#+---+---+---+---+
df.withColumn("arr",explode(arrays_zip(array(lit("a"),lit("b"),lit("c")),array(col("a"),col("b"),col("c"))))).\
select("p","arr.*").\
withColumnRenamed("0","col1").\
withColumnRenamed("1","col2").\
show()
#dynamically getting column names from dataframe
arr=[ lit('{}'.format(d)) for d in df.columns if d !='p']
df.withColumn("arr",explode(arrays_zip(array(arr),array(col("a"),col("b"),col("c"))))).select("p","arr.*").\
withColumnRenamed("0","col1").\
withColumnRenamed("1","col2").\
show()
#+---+----+----+
#| p|col1|col2|
#+---+----+----+
#| p1| a| 2|
#| p1| b| 2|
#| p1| c| 1|
#| p2| a| 4|
#| p2| b| 3|
#| p2| c| 2|
#+---+----+----+