Как обновить вложенный столбец в spark DataFrame - PullRequest
0 голосов
/ 14 января 2020

У меня есть следующая вложенная таблица, и я пытаюсь заменить столбец closeddate на NewClosedDate:

root
--field1 : string (nullable = true)
--field2 : string (nullable = true)
--field100 : string (nullable = true)
-- accountlinks1 : array (nullable = true)
-- accountlinks2 : array (nullable = true)
-- accountlinks3 : array (nullable = true)
-- accountlinks100: array (nullable = true)
 |    |    |-- account: struct (nullable = true)
 |    |    |    |-- acctno: string (nullable = true)
 |    |    |    |-- subid: string (nullable = true)
 |    |    |    |-- mcode: string (nullable = true)
 |    |    |    |-- openeddate: string (nullable = true)
 |    |    |    |-- closeddate: string (nullable = true)
-- NewClosedDate: timestamp (nullable = true)

Есть много полей (String и Array) внутри root, много структур внутри каждого массива, а также много полей внутри каждой структуры. Поэтому мне было интересно, как я могу заменить поле closeddate на NewClosedDate, используя Spark / DataFrame. Поле NewClosedDate генерируется после объединения двух DF.

1 Ответ

0 голосов
/ 14 января 2020

Вы можете сделать это несколькими способами - используя набор данных и класс case или UDF.

Вот как использовать класс case,


    case class Account(accountNo:String, subbed: String, var closeDate : Timestamp)

    case class MyTable(field1:String, field2  ......
    , accountlinks100 : Seq[Account], newCloseDate : Timestamp
    )

    val df = // read dataframe.as[MyTable]
    val updatedDf = df.map{ r : MyTable => 
    r.accountlinks100.forEach(a => a.closeDate = r.newCloseDate)
    r
    }

Я использовал var для создания поле обновляемое. Если вам это не нравится, используйте val и скопируйте объект MyTable в новый объект с измененным значением closeDate.

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