将 Dataframe 转换为多个二维数组

Convert Dataframe to multiple 2D arrays

我有这个数据集:

+----+-----+-------+-----+
|code|code2|machine|value|
+----+-----+-------+-----+
|   1|    2|      A|   42|
|   2|    1|      A|   11|
|   1|    4|      A|   55|
|   1|    1|      B|    2|
|   3|    3|      B|   34|
|   3|    2|      B|  111|
+----+-----+-------+-----+

我希望每台机器都有一个如下所示的矩阵:
code 和 code2 是列,在交叉点我想填充值。

机器A

+----+----+----+----+----+
|   A|   1|   2|   3|   4|
+----+----+----+----+----+
|   1|   0|  11|   0|   0|
|   2|  42|   0|   0|   0|
|   3|   0|   0|   0|   0|
|   4|  55|   0|   0|   0|
+----+----+----+----+----+

机器 B

+----+----+----+----+----+
|   B|   1|   2|   3|   4|
+----+----+----+----+----+
|   1|   2|   0|   0|   0|
|   2|   0|   0| 111|   0|
|   3|   0|   0|  34|   0|
|   4|   0|   0|   0|   0|
+----+----+----+----+----+

我那里有多台机器(未知号码),代码只能是0-255。 所以我的问题是如何实现该矩阵...

我第一个天真的想法是制作一个哈希图,并将机器名称作为键,将 256x256 二维数组作为值。但我认为这不会有效率,我也不知道如何实现。

或者可能每台机器都有一个数据集??

如果有人有想法我想听听。

顺便说一句,我正在使用 Scala。

为了获得最大的编码灵活性,您可以切换到 RDD API。一个解决方案的例子会给你一个 RDD,它将机器映射到它的矩阵,表示为一个 scala 二维数组。请注意,Array.ofDimInt 创建了一个二维正弦 n*m 数组,各处都为零。

df
    .map(x=> x.getAs[String]("machine") -> (x.getAs[Int]("code"), x.getAs[Int]("code2"),x.getAs[Int]("value")))
    .groupByKey
    .mapValues( seq => {
         var result = Array.ofDim[Int](256, 256)
         seq.foreach{ case (i,j,value) => result(i)(j) = value }
         result
     })