У меня сейчас есть фрейм данных
df1 =
+-----+
| val|
+-----+
| 1|
| 2|
| 3|
....
| 2456|
+-----+
Каждое значение соответствует отдельной ячейке в 3d-кубе.У меня есть функция findNeighbors , которая возвращает список соседних кубов, который я затем отображаю на df1, чтобы получить соседей каждой строки.
df2 = df1.map(row => findNeighbors(row(0).toInt)
В результате получается что-то вроде
df2 =
+---------------+
| neighbors|
+---------------+
| (1,2), (1, 7)|
| (2,1), (2, 3)|
.... etc
+---------------+
Где для каждой строки, для каждого массива в этой строке первый элемент - это значение ячейки, а второй - значение ее соседа.
Теперь я хочу создатьновый фрейм данных, который берет все эти вложенные массивы и делает их строками примерно так:
finalDF =
+-----+------+
| cell|neighb|
+-----+------+
| 1| 2|
| 1| 7|
| 2| 1|
| 2| 3|
.... etc
+------------+
И вот где я застрял
Я пытался использовать приведенный ниже код, но я не могу 'добавить к локальному фрейму данных из функции foreach.
var df: DataFrame = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], my_schema)
val colNames = Seq("cell", "neighb")
neighborsDf.foreach(row => {
var rowDf: DataFrame = row.toDF(colNames: _*)
df.union(rowDf)
})
Я уверен, что есть гораздо лучший способ решения этой проблемы, но я очень новичок и очень потерян в скале / искре, и 10 часов поиска в Google мне не помогли.