Может быть, это может помочь вам немного, в scala с использованием rdd, но в java должно быть очень похоже.
val df = Seq(("a", "a", "a"), ("a", "b", "c"), ("b", "b", "c")).toDF("Col1","Col2","Col3")
df.show()
val ok = df.rdd.map(s => {
var arr = new Array[(String, String)](s.size)
for (i <- 0 to s.size - 1) {
arr(i) = (s.getString(i), s.schema.fieldNames(i))
}
arr
}).map(s => {
for (i <- s) yield ((i._2, i._1), 1)
}).flatMap(s => s)
.reduceByKey(_ + _)
.map(s => (s._1._1, s._1._2 + "=" + s._2))
.reduceByKey(_ +","+ _)
ok.foreach(println(_))
+----+----+----+
|Col1|Col2|Col3|
+----+----+----+
| a| a| a|
| a| b| c|
| b| b| c|
+----+----+----+
(Col1,a=2,b=1)
(Col2,b=2,a=1)
(Col3,a=1,c=2)