我目前有一个数据框
[[[[4 0]
[3 3]]
[[3 1]
[3 2]]
[[4 0]
[0 4]]]
[[[2 1]
[0 1]]
[[1 0]
[1 4]]
[[3 0]
[3 0]]]
每个值对应于3d多维数据集中的单个单元格。 我有一个函数 findNeighbors ,该函数返回相邻多维数据集的列表,然后将其映射到df1以获取每一行的邻居。
df1 =
+-----+
| val|
+-----+
| 1|
| 2|
| 3|
....
| 2456|
+-----+
结果类似于
df2 = df1.map(row => findNeighbors(row(0).toInt)
对于每一行,对于该行中的每个Array,第一项是单元格的值,第二项是其邻居的值。
我现在想创建一个新的数据框,该数据框采用所有这些嵌套数组并使它们像这样行:
df2 =
+---------------+
| neighbors|
+---------------+
| (1,2), (1, 7)|
| (2,1), (2, 3)|
.... etc
+---------------+
这就是我被困住的地方
我尝试使用下面的代码,但无法从foreach函数中追加到本地数据帧。
finalDF =
+-----+------+
| cell|neighb|
+-----+------+
| 1| 2|
| 1| 7|
| 2| 1|
| 2| 3|
.... etc
+------------+
我确定有更好的方法来解决此问题,但是我是新手,在scala / spark中非常迷路,并且十个小时的谷歌搜索对我没有帮助。
答案 0 :(得分:1)
从头开始,有点类似的例子:
val df2 = df.select(explode($"neighbours").as("neighbours_flat"))
val df3 = df2.select(col("neighbours_flat").getItem(0) as "cell",col("neighbours_flat").getItem(1) as "neighbour")
df3.show(false)
从邻居字段def开始:
+----------------+
|neighbours_flat |
+----------------+
|[[1, 2], [1, 7]]|
|[[2, 1], [2, 3]]|
+----------------+
导致:
+----+---------+
|cell|neighbour|
+----+---------+
|1 |2 |
|1 |7 |
|2 |1 |
|2 |3 |
+----+---------+
您需要具有数组def,然后使用explode。