spark scala

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

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

  1. import org.apache.spark.sql.functions._
  2. import java.sql.Timestamp
  3. val compareTime = udf((t1: Timestamp, t2: Timestamp) => {
  4. if(t1 != null && t2 != null && t1.before(t2) ){
  5. Some(t1)
  6. }
  7. else if(t1 != null && t2 != null && t2.before(t1)){
  8. Some(t2)
  9. }
  10. else if(t1 != null){
  11. Some(t1)
  12. }
  13. else if(t2 != null){
  14. Some(t2)
  15. }
  16. else {
  17. None
  18. }
  19. })
  20. var df = Seq((1L, "2021-01-04 16:10:00","2021-01-04 15:20:00")).toDF("id","t1","t2")
  21. df = (df.withColumn("t1",to_timestamp($"t1","yyyy-MM-dd HH:mm:ss"))
  22. .withColumn("t2",to_timestamp($"t2","yyyy-MM-dd HH:mm:ss")))
  23. df = df.withColumn("t3",compareTime($"t1",$"t2"))
  24. df.show()
8wigbo56

8wigbo561#

这里可能不需要自定义项—您可以使用sparksql函数 least :

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

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

iqjalb3h

iqjalb3h2#

试试这个:

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

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

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

相关问题