我试着比较两个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()
2条答案
按热度按时间8wigbo561#
这里可能不需要自定义项—您可以使用sparksql函数
least
:与…相反
least
是greatest
,如果要获取两列中较大的一列。请注意,两者
least
以及greatest
将忽略null
值,但它们将返回null
如果所有输入列null
.iqjalb3h2#
试试这个:
它应该和你的工作一样
if
..else if
..else
堆叠。哎呀。我的错。spark不支持scala 2.13.x。请尝试以下操作: