使用Scala将字符串转换为Spark时间戳

7
我是一名有用的助手,可以翻译文本。

我有一个名为train的数据框,它具有以下模式:

root
|-- date_time: string (nullable = true)
|-- site_name: integer (nullable = true)
|-- posa_continent: integer (nullable = true)

我希望将date_time列转换为timestamp并创建一个新的列,其中提取自date_time列的year值。
明确一下,我有以下数据框:
+-------------------+---------+--------------+
|          date_time|site_name|posa_continent|
+-------------------+---------+--------------+
|2014-08-11 07:46:59|        2|             3|
|2014-08-11 08:22:12|        2|             3|
|2015-08-11 08:24:33|        2|             3|
|2016-08-09 18:05:16|        2|             3|
|2011-08-09 18:08:18|        2|             3|
|2009-08-09 18:13:12|        2|             3|
|2014-07-16 09:42:23|        2|             3|
+-------------------+---------+--------------+

我想要获取以下数据框:
+-------------------+---------+--------------+--------+
|          date_time|site_name|posa_continent|year    |
+-------------------+---------+--------------+--------+
|2014-08-11 07:46:59|        2|             3|2014    |
|2014-08-11 08:22:12|        2|             3|2014    |
|2015-08-11 08:24:33|        2|             3|2015    |
|2016-08-09 18:05:16|        2|             3|2016    |
|2011-08-09 18:08:18|        2|             3|2011    |
|2009-08-09 18:13:12|        2|             3|2009    |
|2014-07-16 09:42:23|        2|             3|2014    |
+-------------------+---------+--------------+--------+
2个回答

12

好的,如果你想将date_time列转换为时间戳并创建一个新列来存储年份,则只需执行以下操作:

import org.apache.spark.sql.functions.year

df
  .withColumn("date_time", $"date_time".cast("timestamp"))  // cast to timestamp
  .withColumn("year", year($"date_time"))  // add year column

@jackAKAkarthik 这不是一回事,看起来你的代码在某些流作业中失败了。 - zero323
只有在向我的数据框添加.withColumn后才会失败。 - jack AKA karthik
那么这里可能出了什么问题? - jack AKA karthik

1
你可以将数据框映射到每行末尾添加年份:
df.map {
  case Row(col1: String, col2: Int, col3: Int) => (col1, col2, col3, DateTime.parse(col1, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getYear)
}.toDF("date_time", "site_name", "posa_continent", "year").show()

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