为现有数据框中的每一行创建一个包含许多行的新数据框

时间:2018-11-30 22:17:53

标签: scala apache-spark

我目前有一个数据框

[[[[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中非常迷路,并且十个小时的谷歌搜索对我没有帮助。

1 个答案:

答案 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。