我有一个数据框,其中列C和列D被定义为字符串列类型,但是列中的数据实际上是日期。例如,列C具有日期“01-APR-2015”,而列D具有“20150401”。我想将它们更改为日期列类型,但我没有找到一个好的方法来做到这一点。我查看了stackoverflow,需要将Spark SQL的DataFrame中的字符串列类型转换为日期列类型。日期格式可以是“01-APR-2015”,我查看了此帖子,但它没有与日期相关的信息。
我有一个数据框,其中列C和列D被定义为字符串列类型,但是列中的数据实际上是日期。例如,列C具有日期“01-APR-2015”,而列D具有“20150401”。我想将它们更改为日期列类型,但我没有找到一个好的方法来做到这一点。我查看了stackoverflow,需要将Spark SQL的DataFrame中的字符串列类型转换为日期列类型。日期格式可以是“01-APR-2015”,我查看了此帖子,但它没有与日期相关的信息。
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。
<console>:28: error: too many arguments for method to_date: (e: org.apache.spark.sql.Column)org.apache.spark.sql.Column
- Chaitanya Bapat