【问题标题】:Compare timestamp columns - Spark scala比较时间戳列 - Spark scala
【发布时间】:2021-07-05 22:42:31
【问题描述】:

我正在尝试比较 2 个时间戳列并返回两者中最小值的值,并且想知道是否有比我拥有的更好的方法。请注意,两列可能都有值/其中一列有值,另一列可能为空。我知道When.otherwise。

import org.apache.spark.sql.functions._
import java.sql.Timestamp
 val compareTime = udf((t1: Timestamp, t2: Timestamp) => {
    if(t1 != null && t2 != null && t1.before(t2) ){
     Some(t1)
    }
    else if(t1 != null && t2 != null && t2.before(t1)){
     Some(t2)
    } 
    else if(t1 != null){
     Some(t1)
    } 
     else if(t2 != null){
     Some(t2)
    } 
    else {
       None
    }
  })
 

var df = Seq((1L, "2021-01-04 16:10:00","2021-01-04 15:20:00")).toDF("id","t1","t2")
df = (df.withColumn("t1",to_timestamp($"t1","yyyy-MM-dd HH:mm:ss"))
      .withColumn("t2",to_timestamp($"t2","yyyy-MM-dd HH:mm:ss")))

df = df.withColumn("t3",compareTime($"t1",$"t2"))
df.show()

【问题讨论】:

    标签: scala apache-spark apache-spark-sql user-defined-functions


    【解决方案1】:

    这里可能不需要UDF - 您可以使用Spark SQL函数least

    var df = Seq((1L, "2021-01-04 16:10:00","2021-01-04 15:20:00")).toDF("id","t1","t2")
    df = (df.withColumn("t1",to_timestamp($"t1","yyyy-MM-dd HH:mm:ss"))
          .withColumn("t2",to_timestamp($"t2","yyyy-MM-dd HH:mm:ss")))
    
    df = df.withColumn("t3",least($"t1",$"t2"))
    df.show()
    +---+-------------------+-------------------+-------------------+
    | id|                 t1|                 t2|                 t3|
    +---+-------------------+-------------------+-------------------+
    |  1|2021-01-04 16:10:00|2021-01-04 15:20:00|2021-01-04 15:20:00|
    +---+-------------------+-------------------+-------------------+
    

    least 的反义词是greatest,如果你想获得两列中较大的那一列。

    请注意,leastgreatest 都将忽略 null 值,但如果所有输入列都是 null,它们将返回 null

    【讨论】:

      【解决方案2】:

      试试这个:

      (Option(t1) ++ Option(t2)).minOption
      

      它应该与您的 if..else if..else 堆栈完成相同的工作。


      哎呀。我的错。 Spark 不支持 Scala 2.13.x。试试这个:

      util.Try((Option(t1) ++ Option(t2)).minBy(_.getTime())).toOption
      

      【讨论】:

        猜你喜欢
        • 2020-08-23
        • 1970-01-01
        • 2012-07-09
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2011-07-24
        • 1970-01-01
        相关资源
        最近更新 更多