Spark Scala-时间戳记为date_add()

时间:2019-07-15 16:28:01

标签: scala apache-spark dateadd

我在某些必须很简单的事情上遇到了麻烦。但是我仍处于学习的早期阶段。

问题是:我想获取一个项目的开始日期,然后再添加20天。我想以自动化方式进行操作,而不是手动添加(例如。尽管我知道它开始于2019-06-01,但我不想手动输入日期“ 2019-06-21”,因为我可能会更改它以后,我想这样做是我的懒惰。)

所以,要确定我的开始日期:

val start_date = table.select(date_trunc("day", min('applied_at)).as("start_date"))

哪个要返回

start_date: org.apache.spark.sql.DataFrame = [start_date: timestamp]

但是,如果我尝试在date_add()函数上使用它,则会收到错误消息。

val objective = date_add(start_date, 20)
error: type mismatch;
 found   : org.apache.spark.sql.DataFrame
    (which expands to)  org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
 required: org.apache.spark.sql.Column
                           && date_trunc("day",$"applied_at").as("applied_at") < date_add(start_date, projection_proxy)
                                                                                          ^ 

因此,我尝试了其他格式并进行了一些尝试,但我自己找不到答案。一定是因为我没有必要的基本知识。

我得到的是问我一个列,但是我可以将变量转换成列吗?我是否应该以其他方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

由于错误提示date_add函数接受col数据类型,但是您正尝试传递整个Dataframe。

在现有select上应用dataframe时,无论其具有多少列或行,都会得到一个new dataframe

要添加日期到日期列

df = start_date.withColumn("new_date", date_add($"start_date", 20))

如果您只想显示一列,或者只想显示具有新日期的列

val newDateDF = minDateDF.
  withColumn("new_date", date_add($"start_date", 1))
  .drop($"start_date")
  .select($"new_date".alias("start_date"))

如果您想将其作为值

val new_date = newDateDF.select($"start_date").collect()(0)(0).toString()