spark scala

66bbxpm5  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(423)

我试着比较两个timestamp列并返回两个列中的最小值,我想知道有没有比我的方法更好的方法。注意两列可能都有值/其中一列有值,另一列可以为null。我知道什么时候。否则。

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()
8wigbo56

8wigbo561#

这里可能不需要自定义项—您可以使用sparksql函数 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|
+---+-------------------+-------------------+-------------------+

与…相反 leastgreatest ,如果要获取两列中较大的一列。
请注意,两者 least 以及 greatest 将忽略 null 值,但它们将返回 null 如果所有输入列 null .

iqjalb3h

iqjalb3h2#

试试这个:

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

它应该和你的工作一样 if .. else if .. else 堆叠。
哎呀。我的错。spark不支持scala 2.13.x。请尝试以下操作:

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

相关问题