Pyspark Dataframe:检查日期列中的值是否有效

Pyspark Dataframe: Check if values in date columns are valid

我有一个从 CSV 文件导入的 spark DataFrame。 应用一些操作(主要是删除 columns/rows)后,我尝试将新的 DataFrame 保存到 Hadoop,这会显示一条错误消息:

ValueError: year out of range

我怀疑某些 DateType 或 TimestampType 类型的列已损坏。至少在一个专栏中,我发现了一个年份为“207”的条目 - 这似乎会产生问题。

**如何检查 DataFrame 是否符合要求的时间范围?

我考虑编写一个函数,它接受 DataFrame 并为每个 DateType / TimestampType-Column 获取最小值和最大值,但我无法让它工作。**

有什么想法吗?

PS:据我了解,spark 会始终检查并执行模式。这不包括检查 minimum/maximum 个值吗?

要验证日期,正则表达式 可以提供帮助。

for example: to validate a date with date format MM-dd-yyyy

step1: 为你的日期格式制作一个正则表达式。对于 MM-dd-yyyy 它将是 ^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d$

可以使用this代码实现。

此步骤将有助于找到 invalid dates 无法解析并导致错误的问题。

step2:将字符串转为日期。 以下可以帮助

import scala.util.{Try, Failure}
import org.apache.spark.sql.functions.udf

object FormatChecker extends java.io.Serializable {
  val fmt = org.joda.time.format.DateTimeFormat forPattern "MM-dd-yyyy"
  def invalidFormat(s: String) = Try(fmt parseDateTime s) match {
    case Failure(_) => true
    case _ => false
  }
}

val df = sc.parallelize(Seq(
    "01-02-2015", "99-03-2010", "---", "2015-01-01", "03-30-2001")
).toDF("date")

invalidFormat = udf((s: String) => FormatChecker.invalidFormat(s))
df.where(invalidFormat($"date")).count()