在 Spark 中将元组转换为矩阵
Posted
技术标签:
【中文标题】在 Spark 中将元组转换为矩阵【英文标题】:Transform tuple to matrix in Spark 【发布时间】:2020-08-11 23:02:59 【问题描述】:我有一个看起来像这样的元组和值的 rdd 列表。有成千上万种不同的配对。
(A, B), 1
(B, C), 2
(C, D), 1
(A, D), 1
(D, A), 5
我想将元组值对转换为对应于这些对的矩阵。我没有在 spark 中看到任何简单的方法来做到这一点。
+---+------+------+------+------+
| | A | B | C | D |
+---+------+------+------+------+
| A | - | 1 | NULL | 1 |
| B | NULL | - | 2 | NULL |
| C | NULL | | - | 1 |
| D | 5 | NULL | NULL | - |
+---+------+------+------+------+
【问题讨论】:
scala 可以作为选项吗? 当然更喜欢 Java,但我大概能猜出来。 我的建议,做java。让我看看 我的意思是做 scala 【参考方案1】:尽力而为,但无法使用 spark-sql (您声明)摆脱列名。 只是以自然顺序旋转。 试试看,添加了额外的元组。
import org.apache.spark.sql.functions._
// Note sure what difference is between ("A", "B"), 1 or "A", "B", 1
val rdd = sc.parallelize(Seq( (("A", "B"), 1), (("B", "C"), 2), (("C", "D"), 1), (("A", "D"), 1), (("D", "A"), 5), (("E", "Z"), 500) ))
// Can start from here in fact
val rdd2 = rdd.map(x => (x._1._1, x._1._2, x._2))
val df = rdd2.toDF()
// Natural ordering, but cannot get rid of _1 column in a DF (spark sql)
df.groupBy("_1").pivot("_2").agg(first("_3"))
.orderBy("_1")
.show(false)
返回:
+---+----+----+----+----+----+
|_1 |A |B |C |D |Z |
+---+----+----+----+----+----+
|A |null|1 |null|1 |null|
|B |null|null|2 |null|null|
|C |null|null|null|1 |null|
|D |5 |null|null|null|null|
|E |null|null|null|null|500 |
+---+----+----+----+----+----+
【讨论】:
以上是关于在 Spark 中将元组转换为矩阵的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EmguCV 中将图像转换为矩阵,然后将矩阵转换为位图?