如何从日期字符串中提取年份?

时间:2019-07-18 18:46:05

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

我正在使用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 TIMESTAMP)]; '项目[year('date)AS year(date)#11]

1 个答案:

答案 0 :(得分:0)

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)] ;; '项目[year('date)AS year(date)#11]

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

您可以使用aliasas将看起来很奇怪的自动生成的名称再次更改为类似date的名称,这将起作用。