如何在DataFrames中将列类型从String更改为Date?

dbs*_*ace 12 scala apache-spark apache-spark-sql

我有一个数据框有两列(C,D)被定义为字符串列类型,但列中的数据实际上是日期.例如,列C的日期为"01-APR-2015",列D的日期为"20150401"我想更改这些日期列类型,但我没有找到一个好方法.我看一下我需要在Spark SQL的DataFrame中将字符串列类型转换为Date列类型的堆栈溢出.日期格式可以是"01-APR-2015",我查看这篇文章,但它没有与日期相关的信息

zer*_*323 30

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"))
Run Code Online (Sandbox Code Playgroud)

或者to_timestamp:

df.select(to_date($"ts", "dd-MMM-yyyy").alias("timestamp"))
Run Code Online (Sandbox Code Playgroud)

中间unix_timestamp呼叫.

Spark <2.2

从Spark 1.5开始,您可以使用unix_timestamp函数将字符串解析为long,将其转换为时间戳并截断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"))
Run Code Online (Sandbox Code Playgroud)

注意:

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

从整数类型转换为时间戳将源int视为以毫秒为单位.从时间戳转换为整数类型会在几秒钟内创建结果.

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