Как проверить дату Столбец даты - PullRequest
1 голос
/ 04 июня 2019

У меня есть датафрейм, в котором есть несколько столбцов с данными даты. Я хочу применить проверку к столбцу, и если наступит неправильная дата, я хочу обновить этот фрейм данных с помощью столбца сообщения об ошибке. Я пытался, но не работает правильно. Мой пример данных dataframe.

+-------+-----+-----------+-------------+
|AirName|Place|TakeoffDate|arriveoffDate|
+-------+-----+-----------+-------------+
|  Delta|  Aus|   11/16/18|     08/06/19|
|  Delta|  Pak|   11/16/18|     08/06/19|
| Vistra|  New|   11/16/18|     15/06/19|
|  Delta|  Aus|   15/16/18|     08/06/19|
| JetAir|  Aus|   11/16/18|         null|
+-------+-----+-----------+-------------+

Я попробовал приведенный ниже код.

val DATE_TIME_FORMAT = "MM-dd-yy"

  def validateDf(row: Row): Boolean = try {
    //assume row.getString(1) with give Datetime string
    java.time.LocalDateTime.parse(row.getString(2), java.time.format.DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))
    true
  } catch {
    case ex: java.time.format.DateTimeParseException => {
      // Handle exception if you want
      false
    }
  }

val validDf = sample1.filter(validateDf(_))
val inValidDf = sample1.except(validDf)

ожидаемый фрейм данных

+-------+-----+-----------+-------------+-------------+
|AirName|Place|TakeoffDate|arriveoffDate|error message|
+-------+-----+-----------+-------------+-------------+
|  Delta|  Aus|   11/16/18|     08/06/19|             |
|  Delta|  Pak|   11/16/18|     08/06/19|             |
| Vistra|  New|   11/16/18|     15/06/19|wrong date   |
|  Delta|  Aus|   15/16/18|     08/06/19|wrong date   |
| JetAir|  Aus|   11/16/18|         null|             |
+-------+-----+-----------+-------------+-------------+

1 Ответ

1 голос
/ 04 июня 2019

Я предлагаю использовать пользовательскую функцию (UDF).

Вот пример:

Тестовый фрейм данных

val someDF = Seq(
  ("11/16/18", "Aus"),
  ("15/16/18", "Pak"),
  ("11/16/18", "New")
).toDF("TakeoffDate", "Place")

UDF

import org.apache.spark.sql.functions.udf

def isValidDate = udf((A: String) => {

  val DATE_TIME_FORMAT = "MM/dd/yy"

  try{
    java.time.LocalDate.parse(A, java.time.format.DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))
    true
  } catch {
    case ex: java.time.format.DateTimeParseException => 
      false         
  }
})

Обратите внимание, что я использую LocalDate вместо LocalDateTime.

Использование:

someDF.withColumn("IsValidDate", isValidDate(someDF("TakeoffDate"))).show()

Результат:

+-----------+-----+-----------+
|TakeoffDate|Place|IsValidDate|
+-----------+-----+-----------+
|   11/16/18|  Aus|       true|
|   15/16/18|  Pak|      false|
|   11/16/18|  New|       true|
+-----------+-----+-----------+

Надеюсь, это поможет.

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...