【问题标题】:Spark Scala - timestamp into date_add()Spark Scala - date_add() 中的时间戳
【发布时间】:2019-07-15 16:28:01
【问题描述】:

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

问题是:我想得到一个项目的开始日期,然后再加上 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)
                                                                                          ^ 

所以我尝试了其他格式并玩了一下,但我自己找不到答案。一定是因为我没有必要的基础知识。

我知道它要求我提供一个列,但我可以将一个变量转换为一个列吗?我应该以不同的方式解决这个问题吗?

【问题讨论】:

  • 是来自 org.apache.spark.sql.functions.date_adddate_add() 如果是这样,那么它需要一个 colmn 和 Int 但你正在传递 Dataframe 和 Int。
  • 如果你添加一些和你想要的输出会更好。

标签: scala apache-spark dateadd


【解决方案1】:

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

当您在现有的dataframe 上应用select 时,无论它有多少列或行,您都会得到一个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()

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多