我需要使用date_add()
函数将90天添加到数据框的列中。该功能正常运行,但仅当我对90进行硬编码时才有效。如果数字在另一列中并且引用了该数字,则该功能会要求我提供一个整数才能工作。
此代码有效:
.withColumn("DATE_SUM_COLUMN",date_add(col("DATE_COLUMN"),90))
此代码不:
.withColumn("DATE_SUM_COLUMN",date_add(col("DATE_COLUMN"),col("number")))
谢谢。
答案 0 :(得分:2)
请在这里尝试此操作。我正在将日期转换为秒,将“天”列转换为秒,并对两列进行求和。同样,我们必须将最终结果转换为日期格式。这里date
是我的日期列,add
是日期列要添加的天数
import org.apache.spark.sql.functions._
.withColumn("new col", unix_timestamp($"date", "yyyy-MM-dd") + col("add")*24*60*60)
答案 1 :(得分:2)
您仍然可以使用expr("date_add(date_column, days_to_add)")
函数来评估Spark SQL字符串:
import java.sql.Date
import com.holdenkarau.spark.testing.{DataFrameSuiteBase, SharedSparkContext}
import org.scalatest.FlatSpec
import org.apache.spark.sql.functions.expr
class TestSo2 extends FlatSpec with SharedSparkContext with DataFrameSuiteBase {
"date_add" should "add number of dates specified as Column" in {
import spark.implicits._
val df = Seq(
(Date.valueOf("2019-01-01"), 31),
(Date.valueOf("2019-01-01"), 32)
).toDF("date_column", "days_to_add")
df.show()
/**
* +-----------+-----------+
* |date_column|days_to_add|
* +-----------+-----------+
* | 2019-01-01| 31|
* | 2019-01-01| 32|
* +-----------+-----------+
*/
df.
withColumn(
"next_date",
expr("date_add(date_column, days_to_add)")
).
show
/**
* +-----------+-----------+----------+
* |date_column|days_to_add| next_date|
* +-----------+-----------+----------+
* | 2019-01-01| 31|2019-02-01|
* | 2019-01-01| 32|2019-02-02|
* +-----------+-----------+----------+
*/
}
}
我不知道为何Spark开发人员未将其作为Scala API的一部分的原因。