【问题标题】:How to extract year from a date string?如何从日期字符串中提取年份?
【发布时间】:2019-07-18 18:46:05
【问题描述】:

我使用的是 spark 2.1.2。

我正在处理日期时间数据,并希望使用 spark sql 函数从 dt 字符串中获取年份。

我使用的代码如下:

import org.apache.spark.sql.functions._
import org.apache.spark.sql._
import org.apache.spark.sql.types._
val spark: SparkSession = SparkSession.builder().
appName("myapp").master("local").getOrCreate()

case class Person(id: Int, date: String)
import spark.implicits._

val mydf: DataFrame = Seq(Person(1,"9/16/13")).toDF()
val select_df: DataFrame = mydf.select(unix_timestamp(mydf("date"),"MM/dd/yy").cast(TimestampType))
select_df.select(year($"date")).show()

在上面的示例中,我希望日期的年份为 13

实际org.apache.spark.sql.AnalysisException:无法解析'date'给定的输入列:[CAST(unix_timestamp(date, MM/dd/yy) AS时间戳)];; '项目[年('日期)AS年(日期)#11]

【问题讨论】:

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


    【解决方案1】:
    case class Person(id: Int, date: String)
    val mydf = Seq(Person(1,"9/16/13")).toDF
    val solution = mydf.withColumn("year", year(to_timestamp($"date", "MM/dd/yy")))
    scala> solution.show
    +---+-------+----+
    | id|   date|year|
    +---+-------+----+
    |  1|9/16/13|2013|
    +---+-------+----+
    

    看起来year 不给你两位数,而是给你四年。我将把字符串截断作为家庭练习留给你:)


    实际:org.apache.spark.sql.AnalysisException:无法解析给定输入列的“日期”:[CAST(unix_timestamp(date, MM/dd/yy) AS TIMESTAMP)];; '项目[年('日期)AS年(日期)#11]

    异常的原因是您要访问在select (select(unix_timestamp(mydf("date"),"MM/dd/yy").cast(TimestampType))) 之后不再可用的“旧”date 列(在select(year($"date")))。

    您可以再次使用aliasas 将看起来怪异的自动生成名称更改为date 之类的其他名称,这样就可以了。

    【讨论】:

    • 抱歉,还有一个小问题,假设我还有一个时间列。当我从 df 中选择日期和时间列的连接并显示没有错误时,你知道为什么吗?
    • 我需要更多信息。我一直认为“没有错误”是好的。如果您有任何问题,请在 SO 上提出另一个问题。在这里留下一个链接。谢谢。如果我对您有关日期转换的问题的回答有效,请接受。谢谢。
    • 尽管看起来他们应该有相同的结果。
    • 这里看看新问题,如果你可以stackoverflow.com/questions/57136529/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2021-09-11
    • 2016-08-02
    • 2021-12-05
    • 2020-02-06
    相关资源
    最近更新 更多