У меня есть искра DataFrame, импортированная из файла CSV. После применения некоторых манипуляций (главным образом, удаления столбцов/строк) я пытаюсь сохранить новый DataFrame в Hadoop, который вызывает сообщение об ошибке:
ValueError: год за пределами допустимого диапазона
Я подозреваю, что некоторые столбцы типа DateType или TimestampType повреждены. По крайней мере, в одном столбце я нашел запись с годом '207' - это создает проблемы.
** Как я могу проверить, придерживается ли DataFrame требуемых временных интервалов?
Я думал о написании функции, которая берет DataFrame, и получает за каждый DateType/TimestampType-Column минимум и максимум значений, но я не могу заставить это работать. **
Есть идеи?
PS: По моему мнению, искра всегда проверяла и применяла схему. Будет ли это включать проверку минимальных/максимальных значений?
Для подтверждения даты регулярные выражения могут помочь.
например: для проверки даты с форматом даты MM-dd-yyyy
step1: сделайте регулярное выражение для формата даты. для MM-dd-yyyy это будет ^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\d\d$
Вы можете использовать этот код для реализации.
Этот шаг поможет найти 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()