在 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 中将图像转换为矩阵,然后将矩阵转换为位图?

在 C++ 中将 matlab 矩阵转换为数组的有效方法

如何在 QtCreator 中将图像转换为矩阵形式?

如何在opencv中将图像转换为矩阵[重复]

如何在 C++ 中将 OpenCV 2D 矩阵转换为 1D 数组?

在 Pandas 中将字典转换为对称/距离矩阵的最有效方法