Pyspark数据框:检查日期列中的值是否有效

时间:2018-08-27 11:32:14

标签: python apache-spark apache-spark-sql pyspark-sql

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

  

ValueError:年份超出范围

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

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

我考虑过编写一个函数,该函数采用DataFrame并为每个DateType / TimestampType-Column获取最小值和最大值,但是我无法使其正常工作。**

有什么想法吗?

PS:据我了解,spark始终会检查并强制执行该架构。这不包括检查最小值/最大值吗?

1 个答案:

答案 0 :(得分:0)

正则表达式可以帮助验证日期。

  

例如:验证日期格式为MM-dd-yyyy

的日期

步骤1 :为您的日期格式创建一个正则表达式。对于MM-dd-yyyy,它将为^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d$

您可以使用this代码进行实施。

此步骤将有助于找到不会解析并导致错误的invalid dates

步骤2 :将字符串转换为日期。 以下code可以帮助

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()