scala - Spark DataFrame 中更惯用的日期转换为 ISO 8601 日期
问题描述
我正在将 Spark 2.4.5 与 Scala 2.12.11 一起使用,并且我有一个列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"))
解决方案
推荐阅读
- laravel - 松弛的 Laravel 格式
- c++ - 如何最好地在不支持的 C++ 方言中实现函数指针?
- typescript - Typescript 返回 Promise 列表
- excel - 自动化整合流程
- python - Generator expression vs list comprehension for adding values to a set
- tree - 我想存储树后序遍历而不是打印它?我正在使用递归方法。它如何在数组中存储正确的顺序?
- python-3.x - 碰撞检测:球落地平台
- database - 如何不使用 laravel eloquent 根据另一个表中的记录获取一些数据?
- javascript - “依赖下拉列表”不起作用[谷歌应用引擎上的烧瓶]
- google-sheets - 查询中的变量命名范围单元格引用