比较时间戳列 - 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
,如果你想得到两列中较大的那一个。
请注意,least
和 greatest
都将忽略 null
值,但如果所有输入列都是 null
,它们将 return null
].
我正在尝试比较 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
,如果你想得到两列中较大的那一个。
请注意,least
和 greatest
都将忽略 null
值,但如果所有输入列都是 null
,它们将 return null
].