我需要转换下面的表值,理想情况下,所有列C4行值都将成为列,并且将分别显示指示符
C1 C2 C3 C4
a b c 9
x y z 6
A B C 3
预期产出:
C1 c2 c3 9 6 3
a b c 1 0 0
x v z 0 1 0
A B C 0 0 1
我想用Scala和spark解决问题。 spark版本2.1.1 Scala 2.11.8版本
答案 0 :(得分:1)
如果我正确理解了这个问题,您可以按如下方式使用groupBy/pivot
:
val df = Seq(
("a", "b", "c", 9),
("x", "y", "z", 6),
("A", "B", "C", 3)
).toDF("C1", "C2", "C3", "C4")
df.groupBy("C1", "C2", "C3").
pivot("C4").agg(count(struct("C1", "C2", "C3"))).
na.fill(0).
show
// +---+---+---+---+---+---+
// | C1| C2| C3| 3| 6| 9|
// +---+---+---+---+---+---+
// | x| y| z| 0| 1| 0|
// | a| b| c| 0| 0| 1|
// | A| B| C| 1| 0| 0|
// +---+---+---+---+---+---+