如何在.withColumn函数中获取列的Integer值? [Spark-Scala]

时间:2019-08-21 06:31:35

标签: scala date dataframe apache-spark

我需要使用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")))

谢谢。

2 个答案:

答案 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的一部分的原因。