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()
我有一个从 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()