当前位置: 首页 > 知识库问答 >
问题:

如何验证日期框架的日期列

上官迪
2023-03-14

我有数据帧,它有几个具有日期数据的列。我想对列应用验证,如果日期错误,我想用错误消息列更新该数据帧。我尝试过但工作不正常。我的示例数据帧数据。

+-------+-----+-----------+-------------+
|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|             |
+-------+-----+-----------+-------------+-------------+

共有1个答案

黄弘深
2023-03-14

我建议使用用户定义函数(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?