如何从日期字符串中提取年份?
Posted
技术标签:
【中文标题】如何从日期字符串中提取年份?【英文标题】: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]
【问题讨论】:
【参考方案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"))
)。
您可以再次使用alias
或as
将看起来怪异的自动生成名称更改为date
之类的其他名称,这样就可以了。
【讨论】:
抱歉,还有一个小问题,假设我还有一个时间列。当我从 df 中选择日期和时间列的连接并显示没有错误时,你知道为什么吗? 我需要更多信息。我一直认为“没有错误”是好的。如果您有任何问题,请在 SO 上提出另一个问题。在这里留下一个链接。谢谢。如果我对您有关日期转换的问题的回答有效,请接受。谢谢。 尽管看起来他们应该有相同的结果。 这里看看新问题,如果你可以***.com/questions/57136529/…以上是关于如何从日期字符串中提取年份?的主要内容,如果未能解决你的问题,请参考以下文章