簡體   English   中英

如何驗證spark scala中數據框列中的日期格式

[英]How to validate date format in a dataframe column in spark scala

我有一個包含一個 DateTime 列和許多其他列的數據框。

我想要做的就是解析這個 DateTime 列值並檢查格式是否為"yyyy-MM-dd HH:mm:ss" 如果是這樣,那么我希望將這些有效記錄放在一個數據框中。

如果 DateTime 列包含格式"yyyy-MM-dd HH:mm:ss"以外的任何值。 我想要其他數據框中的那些無效記錄。

謝謝。

您可以使用filter()獲取數據框中的valid/invalid記錄。 從 Scala 的角度來看,此代碼可以改進。

  val DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"

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



val session = SparkSession.builder
  .appName("Validate Dataframe")
  .getOrCreate

val df = session. .... //Read from any datasource

import session.implicits._ //implicits provide except() on df  

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

在這里,我們定義了一個函數來檢查String是否與您的格式要求兼容,並將列表划分為兼容/非部分。 類型以完整的包名稱顯示,但您當然應該使用import語句。

val fmt = "yyyy-MM-dd HH:mm:ss"
val df = java.time.format.DateTimeFormatter.ofPattern(fmt)
def isCompatible(s: String) = try {
  java.time.LocalDateTime.parse(s, df)
  true
} catch {
  case e: java.time.format.DateTimeParseException => false
}
val dts = Seq("2016-11-07 15:16:17", "2016-11-07 24:25:26")
val yesNo = dts.partition { s => isCompatible(s) }
println(yesNo)

使用option("dateFormat", "MM/dd/yyyy")驗證數據框中的日期字段。它將丟棄無效行。

 val df=spark.read.format("csv").option("header", "false").
            option("dateFormat", "MM/dd/yyyy").
            schema(schema).load("D:/cca175/data/emp.csv")

暫無
暫無

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

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