我有一个从CSV文件导入的spark DataFrame。 应用一些操作(主要是删除列/行)之后,我尝试将新的DataFrame保存到Hadoop,这会显示错误消息:
ValueError:年份超出范围
我怀疑DateType或TimestampType类型的某些列已损坏。至少在一个专栏中,我找到了一个年份为“ 207”的条目-这似乎会产生问题。
**如何检查DataFrame是否符合要求的时间范围?
我考虑过编写一个函数,该函数采用DataFrame并为每个DateType / TimestampType-Column获取最小值和最大值,但是我无法使其正常工作。**
有什么想法吗?
PS:据我了解,spark始终会检查并强制执行该架构。这不包括检查最小值/最大值吗?
答案 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()