代码之家  ›  专栏  ›  技术社区  ›  Arjun

激发自定义项以比较日期

  •  -1
  • Arjun  · 技术社区  · 7 年前

    如何在Spark UDF中使用 java.sql.Date .

    像下面这样的…

    def optimisedTDate =
        udf(
          (bdate: Date, tdate: Date, pdate: Date, fcdate: Date) =>
            if (tdate == null && pdate == null) fcdate
            else if (tdate > bdate) tdate
            else bdate
        )
    
    val processed_df = base_df.withColumn(
          "final_date",
          optimisedTDate(lit {
            Date.valueOf("2010-01-01")
          },
            col("tdate"),
            col("pdate"),
            col("fcdate")))
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Leo C    7 年前

    正如其他人所建议的,尽可能使用spark的内置函数以获得更好的性能。如果你一定要去 udf ,您可以使用 implicit conversion 要启用日期/时间比较:

    import scala.language.implicitConversions
    import org.joda.time.DateTime
    import java.sql.Date
    
    val d1 = Date.valueOf("2018-06-11")
    val d2 = Date.valueOf("2018-06-12")
    
    implicit def dateToDT(d: Date) = new DateTime(d)
    
    d1.isAfter(d2)
    // res1: Boolean = false
    
    d1.isBefore(d2)
    // res2: Boolean = true
    

    如果您更喜欢使用不等式运算符,请改用以下方法:

    implicit def dateToDT(d: Date) = (new DateTime(d)).getMillis
    
    d1 > d2
    // res3: Boolean = false
    
    d1 < d2
    // res4: Boolean = true