【问题标题】:Pyspark Dataframe: Check if values in date columns are validPyspark Dataframe:检查日期列中的值是否有效
【发布时间】:2018-08-27 21:11:36
【问题描述】:

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

ValueError:年份超出范围

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

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

我想过编写一个函数,该函数采用 DataFrame 并为每个 DateType / TimestampType-Column 获取最小值和最大值,但我无法让它工作。**

有什么想法吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    例如:验证日期格式为 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:将字符串转换为日期。 以下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()
    

    【讨论】:

    • 嗨,非常感谢您的努力 - 我明白您的主要想法。不幸的是,我的 Scala 知识非常有限——这在 Python/PySpark 中如何工作?我认为 java.io.Serializable 不可用,是吗?
    • 我们如何在 PySpark 中做到这一点?
    猜你喜欢
    • 2021-11-04
    • 2017-02-28
    • 2012-03-15
    • 1970-01-01
    • 2023-02-22
    • 2020-01-24
    • 2013-01-09
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多