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' 映射到类别 A
、B
和 C
,所以我希望上面的矩阵显示 1
值 A-A
、A-B
和 A-C
(反之亦然),目前,它只显示 A-A
的 1
值。
我将代码更改为 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|
+----------+---+---+---+---+---+
我在 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' 映射到类别 A
、B
和 C
,所以我希望上面的矩阵显示 1
值 A-A
、A-B
和 A-C
(反之亦然),目前,它只显示 A-A
的 1
值。
我将代码更改为 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|
+----------+---+---+---+---+---+