【问题标题】:Add Number of days column to Date Column in same dataframe for Spark Scala App将天数列添加到 Spark Scala App 的同一数据框中的日期列
【发布时间】:2017-06-05 03:37:37
【问题描述】:

我有一个columns ("id", "current_date", "days")dataframe df,我正在尝试将“days”添加到“current_date”并创建一个新的dataframe,新的column 称为“ new_date" 使用 spark scala 函数 date_add()

val newDF = df.withColumn("new_Date", date_add(df("current_date"), df("days").cast("Int")))

但看起来函数date_add 只接受Int 值而不接受columns。在这种情况下如何获得所需的输出?我可以使用任何替代功能来获得所需的输出吗?

火花版本:1.6.0 斯卡拉版本:2.10.6

【问题讨论】:

    标签: scala apache-spark dataframe dateadd


    【解决方案1】:

    无需使用 UDF,您可以使用 SQL 表达式来完成:

    val newDF = df.withColumn("new_date", expr("date_add(current_date,days)"))
    

    【讨论】:

    • 你甚至可以跳过expr直接使用(在spark 2.1+中)val newDF = df.withColumn("new_date", date_add($"current_date",days))
    • 我还没有找到使这种语法 (val newDF = df.withColumn("new_date", date_add($"current_date",days))) 工作的方法。截至今天,在 Spark 2.2 中,我可以使用的唯一选项是 UDF 或 expr()(我更喜欢 UDF)。请参阅stackoverflow.com/questions/50222781/… 了解更多信息。
    • 感谢您的解决方案,但是当我尝试您上面提到的代码时,列正在生成,但其中的值为空。这是一段代码。 val dt3 = dt2.withColumn("new_date", expr("date_add('Week Start',dummy)"))你能帮我解决这个问题吗?
    【解决方案2】:

    一个小的自定义 udf 可用于使这种日期算术成为可能。

    import org.apache.spark.sql.functions.udf
    import java.util.concurrent.TimeUnit
    import java.util.Date
    import java.text.SimpleDateFormat    
    
    val date_add = udf((x: String, y: Int) => {
        val sdf = new SimpleDateFormat("yyyy-MM-dd")
        val result = new Date(sdf.parse(x).getTime() + TimeUnit.DAYS.toMillis(y))
      sdf.format(result)
    } )
    

    用法

    scala> val df = Seq((1, "2017-01-01", 10), (2, "2017-01-01", 20)).toDF("id", "current_date", "days")
    df: org.apache.spark.sql.DataFrame = [id: int, current_date: string, days: int]
    
    scala> df.withColumn("new_Date", date_add($"current_date", $"days")).show()
    +---+------------+----+----------+
    | id|current_date|days|  new_Date|
    +---+------------+----+----------+
    |  1|  2017-01-01|  10|2017-01-11|
    |  2|  2017-01-01|  20|2017-01-21|
    +---+------------+----+----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-08
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2022-06-15
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多