Pyspark Dataframe: Проверьте, являются ли значения в столбцах даты действительными

1

У меня есть искра DataFrame, импортированная из файла CSV. После применения некоторых манипуляций (главным образом, удаления столбцов/строк) я пытаюсь сохранить новый DataFrame в Hadoop, который вызывает сообщение об ошибке:

ValueError: год за пределами допустимого диапазона

Я подозреваю, что некоторые столбцы типа DateType или TimestampType повреждены. По крайней мере, в одном столбце я нашел запись с годом '207' - это создает проблемы.

** Как я могу проверить, придерживается ли DataFrame требуемых временных интервалов?

Я думал о написании функции, которая берет DataFrame, и получает за каждый DateType/TimestampType-Column минимум и максимум значений, но я не могу заставить это работать. **

Есть идеи?

PS: По моему мнению, искра всегда проверяла и применяла схему. Будет ли это включать проверку минимальных/максимальных значений?

Теги:
apache-spark
apache-spark-sql
pyspark-sql

1 ответ

0
Лучший ответ

Для подтверждения даты регулярные выражения могут помочь.

например: для проверки даты с форматом даты 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()
  • 0
    Привет, большое спасибо за ваши усилия - я понял вашу главную идею. К сожалению, мои знания Scala очень ограничены - как это будет работать в Python / PySpark? Я думаю, что java.io.Serializable не доступен, не так ли?
  • 0
    Как мы это делаем в PySpark?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню