scala—spark dataframe中更惯用的日期转换为iso 8601日期

r3i60tvu  于 2021-05-27  发布在  Spark
关注(0)|答案(0)|浏览(272)

我在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"))

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题