合并两列,强制转换两个时间戳并从df中选择不会导致错误,但是将一列强制转换为时间戳并选择会导致错误

时间:2019-07-21 19:59:01

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

说明

当我尝试选择转换为unix_timestamp的列,然后再从数据帧添加时间戳时,出现sparkanalysisexception错误。 请参见下面的链接。

但是,当我合并两列,然后将组合转换为unix_timestamp,然后转换为timestamp类型,然后从df中选择时,没有错误。

不同案例

错误: How to extract year from a date string?

没有错误

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, time:String)
import spark.implicits._

val mydf: DataFrame = Seq(Person(1,"9/16/13", "11:11:11")).toDF()
//solution.show()
//column modificaton

val datecol: Column = mydf("date")
val timecol: Column = mydf("time")
val newcol: Column = unix_timestamp(concat(datecol,lit(" "),timecol),"MM/dd/yy").cast(TimestampType)

mydf.select(newcol).show()

结果

预期: 错误火花分析,无法在mydf中找到unix_timestamp(concat(....))

实际

+------------------------------------------------------------------+
|CAST(unix_timestamp(concat(date,  , time), MM/dd/yy) AS TIMESTAMP)|
+------------------------------------------------------------------+
|                                              2013-09-16 00:00:...|

1 个答案:

答案 0 :(得分:0)

这些情况似乎并不完全不同。在错误的情况下,您有一个具有更改的列名的新数据框。见下文:-

val select_df: DataFrame = mydf.select(unix_timestamp(mydf("date"),"MM/dd/yy").cast(TimestampType))
select_df.select(year($"date")).show()

在这里,select_df数据帧已将列名从date更改为cast(unix_timestamp(mydf("date"),"MM/dd/yy")) as Timestamp

在上述情况下,您只是在说一个新列时:-

val newcol: Column = unix_timestamp(concat(datecol,lit(" "),timecol),"MM/dd/yy").cast(TimestampType)

然后使用它从数据框中选择内容,从而给出预期的结果。

希望这使事情变得更清楚。

相关问题