我在scala 2.12.11中使用spark 2.4.5,我有一个列 registered
在这些例子后面是日期字符串,
Mar 23, 2005
Dec 6, 2005
我将此列转换为datetype,代码在功能上是正确的。步骤是,
将字符串“2005年12月6日”转换为“2005-12-06”
使用 cast(DateType)
将iso 8601日期转换为日期类型。
import org.apache.spark.sql.functions.{col, udf}
object Utils {
private val dtFormatter = DateTimeFormatter.ofPattern("MMM d, yyyy")
def convertToIso(date: String): Option[String] = {
Option(date).map {
nnDate =>
val dt = dtFormatter.parse(nnDate)
DateTimeFormatter.ISO_LOCAL_DATE.format(dt)
}
}
def toIsoUdf: UserDefinedFunction = udf(convertToIso _)
}
private def structureProfiles(profileDf: DataFrame): DataFrame = {
profileDf
.withColumn(
"registered_dt",
Utils.toIsoUdf(col("registered")).cast(DateType))
}
列可能为空,因此使用 Option
看起来效果不错。
有更惯用的方法吗?
更新
我发现这个方法简单得多。 Utils
不需要。
import org.apache.spark.sql.functions.to_date
df1
.withColumn(
"registered", to_date(col("registered"), "MMM d, yyy"))
暂无答案!
目前还没有任何答案,快来回答吧!