我有数据帧,它有几个具有日期数据的列。我想对列应用验证,如果日期错误,我想用错误消息列更新该数据帧。我尝试过但工作不正常。我的示例数据帧数据。
+-------+-----+-----------+-------------+
|AirName|Place|TakeoffDate|arriveoffDate|
+-------+-----+-----------+-------------+
| Delta| Aus| 11/16/18| 08/06/19|
| Delta| Pak| 11/16/18| 08/06/19|
| Vistra| New| 11/16/18| 15/06/19|
| Delta| Aus| 15/16/18| 08/06/19|
| JetAir| Aus| 11/16/18| null|
+-------+-----+-----------+-------------+
我尝试了以下代码。
val DATE_TIME_FORMAT = "MM-dd-yy"
def validateDf(row: Row): Boolean = try {
//assume row.getString(1) with give Datetime string
java.time.LocalDateTime.parse(row.getString(2), java.time.format.DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))
true
} catch {
case ex: java.time.format.DateTimeParseException => {
// Handle exception if you want
false
}
}
val validDf = sample1.filter(validateDf(_))
val inValidDf = sample1.except(validDf)
预期数据帧
+-------+-----+-----------+-------------+-------------+
|AirName|Place|TakeoffDate|arriveoffDate|error message|
+-------+-----+-----------+-------------+-------------+
| Delta| Aus| 11/16/18| 08/06/19| |
| Delta| Pak| 11/16/18| 08/06/19| |
| Vistra| New| 11/16/18| 15/06/19|wrong date |
| Delta| Aus| 15/16/18| 08/06/19|wrong date |
| JetAir| Aus| 11/16/18| null| |
+-------+-----+-----------+-------------+-------------+
我建议使用用户定义函数(UDF)。
下面是一个示例:
测试数据帧
val someDF = Seq(
("11/16/18", "Aus"),
("15/16/18", "Pak"),
("11/16/18", "New")
).toDF("TakeoffDate", "Place")
自定义项
import org.apache.spark.sql.functions.udf
def isValidDate = udf((A: String) => {
val DATE_TIME_FORMAT = "MM/dd/yy"
try{
java.time.LocalDate.parse(A, java.time.format.DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))
true
} catch {
case ex: java.time.format.DateTimeParseException =>
false
}
})
请注意,我使用的是LocalDate,而不是LocalDateTime。
用法:
someDF.withColumn("IsValidDate", isValidDate(someDF("TakeoffDate"))).show()
结果:
+-----------+-----+-----------+
|TakeoffDate|Place|IsValidDate|
+-----------+-----+-----------+
| 11/16/18| Aus| true|
| 15/16/18| Pak| false|
| 11/16/18| New| true|
+-----------+-----+-----------+
希望有帮助。
当做
问题内容: 我正在尝试测试以确保某个日期有效(如果有人输入则应该是错误的)。 我如何在任何日期都可以这样做? 问题答案: 验证日期字符串的一种简单方法是将其转换为日期对象并进行测试,例如 以这种方式测试日期时,仅需要测试月份,因为如果日期超出范围,则月份会更改。如果月份超出范围,则相同。任何年份均有效。 您还可以测试日期字符串的位:
问题内容: 我试图建立一个PHP日期验证(MM / DD / YYYY),但我遇到了问题。这是我得到的样本: 问题答案: 您可以使用checkdate。例如,如下所示: 一种更偏执的方法,不会盲目相信输入内容:
我正在尝试设置php日期验证(MM/DD/YYYY),但我遇到了问题。以下是我得到的一个示例:
问题内容: 我正在写一个shell脚本,并且对为什么我的日期验证代码不起作用感到困惑。我针对发现的类似问题尝试了以下解决方案,但is_valid始终设置为1: 如何正确验证日期格式?只有格式为MM / DD / YYYY的日期才有效 我也尝试了以下解决方案:Linux Bash-日期格式,但它也总是拒绝日期。 问题答案: Mac OS X随附的BSD 不支持该选项(或者,它用于完全不同的东西)。安
如何使用threeten BP验证自定义格式的日期,如31/02/1985?