【问题标题】:Convert string to timestamp for Spark using Scala使用 Scala 将字符串转换为 Spark 的时间戳
【发布时间】:2016-05-20 14:33:58
【问题描述】:

我有一个名为train 的数据框,他有以下架构:

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

我想将date_timecolumn 转换为timestamp,并使用从date_timecolumn 中提取的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    |
+-------------------+---------+--------------+--------+

【问题讨论】:

    标签: scala apache-spark apache-spark-sql timestamp


    【解决方案1】:

    好吧,如果您想将 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 这不是一回事,看起来您的代码因某些流式作业而失败。
    • 只有在将 .withColumn 添加到我的数据框后才会失败。
    • 那么这里的问题可能是什么?
    【解决方案2】:

    您可以映射数据框以在每行的末尾添加年份:

    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()
    

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2018-01-15
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 2020-11-22
      • 2023-03-17
      相关资源
      最近更新 更多