Это слишком много для того, чего вы хотите достичь. Вы можете получить желаемый результат от sdf1
.
Одним из способов является создание столбца массива, который содержит структуры имени столбца и соответствующие им максимальные значения. Затем взорвите его и выберите поля структуры.
Вот пример:
data = [(1, "a", 4), (2, "a", 6), (1, "a", 7), (3, "a", 9)]
df = spark.createDataFrame(data, ["id1", "id2", "id3"])
agg_instructions = array(
*[struct(lit(c).alias("ids"), max(col(c)).cast("string").alias("max")) for c in df.columns]
)
df.agg(agg_instructions.alias("agg")) \
.withColumn("agg", explode(col("agg"))) \
.select("agg.*") \
.show()
#+---+---+
#|ids|max|
#+---+---+
#|id1|3 |
#|id2|a |
#|id3|9 |
#+---+---+