我正在使用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]
答案 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]
出现异常的原因是您要访问date
(select(year($"date"))
之后不再可用的“旧” select
列(在select(unix_timestamp(mydf("date"),"MM/dd/yy").cast(TimestampType))
中)。 / p>
您可以使用alias
或as
将看起来很奇怪的自动生成的名称再次更改为类似date
的名称,这将起作用。