Создание нового кадра данных с множеством строк для каждой строки в существующем кадре данных - PullRequest
0 голосов
/ 01 декабря 2018

У меня сейчас есть фрейм данных

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 мне не помогли.

1 Ответ

0 голосов
/ 01 декабря 2018

Начиная немного по дорожке, пример несколько похожий:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...