Spark:多列数据透视

Spark : Pivot with multiple columns

我在 Spark 中读取了以下 json 文件:

{"id" : "123", "category" : "A"}
{"id" : "456", "category" : "B"}
{"id" : "567", "category" : "C"}
{"id" : "678", "category" : "D"}
{"id" : "789", "category" : "E"}
{"id" : "123", "category" : "B"}
{"id" : "123", "category" : "C"}

我想 pivot 它生成 mxn 类别矩阵。下面是我的代码:

val df = spark.read.json("test.json")
val pivots = df.groupBy("category").pivot("category").count()
pivots.show()

这会生成以下输出:

+--------+----+----+----+----+----+
|category|   A|   B|   C|   D|   E|
+--------+----+----+----+----+----+
|       E|null|null|null|null|   1|
|       B|null|   2|null|null|null|
|       D|null|null|null|   1|null|
|       C|null|null|   2|null|null|
|       A|   1|null|null|null|null|
+--------+----+----+----+----+----+

我真正想做的是,以 id 为中心并显示此矩阵中的计数。例如。 id '123' 映射到类别 ABC,所以我希望上面的矩阵显示 1A-AA-BA-C(反之亦然),目前,它只显示 A-A1 值。

我将代码更改为 group by 'id' 但这导致第一列中的值 id 而我想要类别。

有什么方法可以做到这一点(也许使用完全不同的方法)?

首先重命名列并应用自连接:

val leftRight = df
  .withColumnRenamed("category", "left")
  .join(df.withColumnRenamed("category", "right"), Seq("id"))

获取每个 id 的共现。接下来申请 crosstab:

leftRight.stat.crosstab("left", "right")

聚合所有 ID 的数据。结果是:

+----------+---+---+---+---+---+
|left_right|  A|  B|  C|  D|  E|
+----------+---+---+---+---+---+
|         E|  0|  0|  0|  0|  1|
|         A|  1|  1|  1|  0|  0|
|         B|  1|  2|  1|  0|  0|
|         C|  1|  1|  2|  0|  0|
|         D|  0|  0|  0|  1|  0|
+----------+---+---+---+---+---+