簡體   English   中英

Pyspark數據框:檢查日期列中的值是否有效

[英]Pyspark Dataframe: Check if values in date columns are valid

我有一個從CSV文件導入的spark DataFrame。 應用了一些操作(主要是刪除列/行)之后,我嘗試將新的DataFrame保存到Hadoop,這會顯示錯誤消息:

ValueError:年份超出范圍

我懷疑某些類型為DateType或TimestampType的列已損壞。 至少在一個專欄中,我找到了一個年份為“ 207”的條目-這似乎會產生問題。

**如何檢查DataFrame是否符合要求的時間范圍?

我考慮過編寫一個采用DataFrame並為每個DateType / TimestampType-Column獲取最小值和最大值的函數,但是我無法使其正常工作。**

有任何想法嗎?

PS:據我了解,spark總是會檢查並強制執行架構。 這不包括檢查最小值/最大值嗎?

為了驗證日期, 正則表達式可以提供幫助。

例如:驗證日期格式為MM-dd-yyyy的日期

步驟1 :為您的日期格式創建正則表達式。 對於MM-dd-yyyy,它將是^(0[1-9]|[12][0-9]|3[01])[- \\/.](0[1-9]|1[012])[- \\/.](19|20)\\d\\d$

您可以使用代碼進行實施。

此步驟將有助於查找將不會解析並導致錯誤的invalid dates

步驟2 :將字符串轉換為日期。 以下代碼可以幫助您

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM