Как проанализировать / преобразовать строковый столбец в кадре данных в столбец даты и времени с Scala - PullRequest
0 голосов
/ 03 февраля 2020

Мои текущие данные в этом формате: 2013-07-25 00:00:00.0,

orders.take(10).foreach(println)

1,2013-07-25 00:00:00.0,11599,CLOSED
2,2012-07-25 00:00:00.0,256,PENDING_PAYMENT
3,2011-07-25 00:00:00.0,12111,COMPLETE
4,2014-07-25 00:00:00.0,8827,CLOSED
5,2015-07-25 00:00:00.0,11318,COMPLETE
6,2016-07-25 00:00:00.0,7130,COMPLETE
7,2017-07-25 00:00:00.0,4530,COMPLETE
8,2018-07-25 00:00:00.0,2911,PROCESSING
9,2019-07-25 00:00:00.0,5657,PENDING_PAYMENT
10,2009-07-25 00:00:00.0,5648,PENDING_PAYMENT

Я знаю, как преобразовать строку в int:

val ordersMap = orders.map(a=>(
a.split(",")(0).toInt, 
a.split(",")(1), 
a.split(",")(2).toInt, 
a.split(",")(3)
))

Но для второй даты столбца в строковом формате я ищу простой способ, такой как .toInt, все, что мне нужно, это разобрать его в дату и время.

Интересно, есть ли простой способ? сделать это на всех строках в фрейме данных, и если есть гибкий способ размещения различных форматов даты и времени, таких как yyyy/mm/dd, mm/dd/yyyy, dd/mm/yyyy и др. c.

Спасибо .

[ОБНОВЛЕНИЕ1] Благодаря предложению @ smac89 я безуспешно пытался, скриншот здесь:

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Вот чем я закончил, громоздким, но работающим:

import java.time._
import java.time.format.DateTimeFormatter
import org.apache.spark.sql.functions._

......

val datetime_format = DateTimeFormatter.ofPattern("yyyy-MM-dd")
val test="2013-07-25 00:00:..."
val myd = test.substring(0,10).format(datetime_format)
val mydate = datetime_format.parse(myd)
0 голосов
/ 03 февраля 2020

Вы можете просто сделать LocalDate.parse, как в дубликате, но AFAIK нет такого расширения для дат. Вы можете легко создать свой собственный, хотя:

implicit class StringDates(ds: String) {
    def toLocalDate: LocalDate = ds.toLocalDate(DateTimeFormatter.ISO_LOCAL_DATE)
    def toLocalDate(fmt: DateTimeFormatter): LocalDate = LocalDate.parse(ds, fmt)
}

Теперь вы можете сделать:

"2013-07-25".toLocalDate

Или передать форматер, выполнив:

"2013-07-25".toLocalDate(fmt)

Попробуйте это на Scast ie 1 Попробуйте в Scast ie 2

Вы можете легко создать больше форматеров, выполнив:

DateTimeFormatter.ofPattern("yyyy/mm/dd")

См. Шаблоны для форматирования и синтаксического анализа

...