将 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
})
我有这个数据集:
+----+-----+-------+-----+
|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
})