Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark自定义项比较日期_Scala_Apache Spark - Fatal编程技术网

Scala Spark自定义项比较日期

Scala Spark自定义项比较日期,scala,apache-spark,Scala,Apache Spark,如何使用java.sql.date在spark UDF中进行日期比较 下面是一个例子 def optimisedTDate = udf( (bdate: Date, tdate: Date, pdate: Date, fcdate: Date) => if (tdate == null && pdate == null) fcdate else if (tdate > bdate) tdate els

如何使用
java.sql.date
在spark UDF中进行日期比较

下面是一个例子

def optimisedTDate =
    udf(
      (bdate: Date, tdate: Date, pdate: Date, fcdate: Date) =>
        if (tdate == null && pdate == null) fcdate
        else if (tdate > bdate) tdate
        else bdate
    )

val processed_df = base_df.withColumn(
      "final_date",
      optimisedTDate(lit {
        Date.valueOf("2010-01-01")
      },
        col("tdate"),
        col("pdate"),
        col("fcdate")))

正如其他人所建议的,尽可能使用Spark的内置功能以获得更好的性能。如果必须使用
udf
,可以使用
隐式转换来启用日期/时间比较:

import scala.language.implicitConversions
import org.joda.time.DateTime
import java.sql.Date

val d1 = Date.valueOf("2018-06-11")
val d2 = Date.valueOf("2018-06-12")

implicit def dateToDT(d: Date) = new DateTime(d)

d1.isAfter(d2)
// res1: Boolean = false

d1.isBefore(d2)
// res2: Boolean = true
如果您更喜欢使用不等式运算符,请使用以下运算符:

implicit def dateToDT(d: Date) = (new DateTime(d)).getMillis

d1 > d2
// res3: Boolean = false

d1 < d2
// res4: Boolean = true
implicit def dateToDT(d:Date)=(new DateTime(d)).getMillis
d1>d2
//res3:Boolean=false
d1
你不能用内置函数来代替自定义项吗?实际上有很多比较要做,因此我想创建一个自定义项。所讨论的是一个非常基本的比较逻辑,而不是您希望使用when/other的完整比较逻辑。请尽可能使用UDF上的内置函数,它们充分利用了数据布局的知识,并为您节省了大量UDF所需的序列化/反序列化时间<代码>$“date1”。介于($“date2”和$“date3”)之间的($“date2”)和($“date3”)
在IMHO中也更具可读性。感谢大家的帮助,我使用内置函数实现了这一功能。:)