如何使用 Scala parse/convert 数据框中的字符串列到日期时间列
How to parse/convert a string column in dataframe to datetime column with Scala
我当前的数据是这种格式: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
我知道如何将字符串转换为整数:
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
,等等
谢谢。
[更新1]
感谢@smac89 的建议,我试过了,没有成功,截图在这里:
您可以像在副本中那样做 LocalDate.parse
,但据我所知,日期没有这样的扩展。不过,您可以轻松创建自己的:
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)
Try it on Scastie 1
Try it on Scastie 2
您可以通过以下操作轻松创建更多格式化程序:
DateTimeFormatter.ofPattern("yyyy/mm/dd")
这是我的结尾,虽然麻烦但有效:
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)
我当前的数据是这种格式: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
我知道如何将字符串转换为整数:
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
,等等
谢谢。
[更新1] 感谢@smac89 的建议,我试过了,没有成功,截图在这里:
您可以像在副本中那样做 LocalDate.parse
,但据我所知,日期没有这样的扩展。不过,您可以轻松创建自己的:
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)
Try it on Scastie 1
Try it on Scastie 2
您可以通过以下操作轻松创建更多格式化程序:
DateTimeFormatter.ofPattern("yyyy/mm/dd")
这是我的结尾,虽然麻烦但有效:
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)