比较时间戳列 - Spark scala

Compare timestamp columns - Spark scala

我正在尝试比较 2 个时间戳列和 return 两者中最小值的值,想知道是否有比我所拥有的更好的方法。请注意,两列都可能有值/其中一列有值而其他列可能为空。我知道 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()

试试这个:

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

它应该和你的 if..else if..else 堆栈做同样的工作。


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

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

这里可能不需要 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,它们将 return null ].