[英]PySpark - Check from a list of values are present in any of the columns in a Dataframe
[英]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.