如何在 DataFrames 中将列类型从字符串更改为日期?

13

我有一个数据框,其中列C和列D被定义为字符串列类型,但是列中的数据实际上是日期。例如,列C具有日期“01-APR-2015”,而列D具有“20150401”。我想将它们更改为日期列类型,但我没有找到一个好的方法来做到这一点。我查看了stackoverflow,需要将Spark SQL的DataFrame中的字符串列类型转换为日期列类型。日期格式可以是“01-APR-2015”,我查看了此帖子,但它没有与日期相关的信息。

1个回答

31

Spark >= 2.2

你可以使用to_date函数:

import org.apache.spark.sql.functions.{to_date, to_timestamp}

df.select(to_date($"ts", "dd-MMM-yyyy").alias("date"))

或者to_timestamp

df.select(to_date($"ts", "dd-MMM-yyyy").alias("timestamp"))

使用中间函数 unix_timestamp 进行转换。

Spark < 2.2

从 Spark 1.5 开始,您可以使用 unix_timestamp 函数将字符串解析为长整型,将其强制转换为时间戳并截断 to_date:

import org.apache.spark.sql.functions.{unix_timestamp, to_date}

val df = Seq((1L, "01-APR-2015")).toDF("id", "ts")

df.select(to_date(unix_timestamp(
  $"ts", "dd-MMM-yyyy"
).cast("timestamp")).alias("timestamp"))

注意:

根据您使用的Spark版本,由于SPARK-11724,可能需要进行一些调整:

从整数类型到时间戳的转换将源 int 视为毫秒。从时间戳到整数类型的转换会创建以秒为单位的结果。

如果您使用未修补的版本,则需要将unix_timestamp输出乘以1000。


我的编辑被拒绝了,但我很确定你的第一行导入语句中缺少一个“}”,并且你在第7行写成了“to_date”而不是“to_timestamp”。 - Fabich
出现错误 - <console>:28: error: too many arguments for method to_date: (e: org.apache.spark.sql.Column)org.apache.spark.sql.Column - Chaitanya Bapat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接