如何在Spark Scala中验证数据框列中的日期格式

3

我有一个数据框,其中包含一个DateTime列和许多其他列。

我想要做的就是解析这个DateTime列的值,并检查格式是否为"yyyy-MM-dd HH:mm:ss"。如果是,那么我希望将这些有效记录保存在一个数据框中。

如果DateTime列保存的值不是"yyyy-MM-dd HH:mm:ss"格式,则我希望将那些无效记录保存在另一个数据框中。

谢谢。

3个回答

3
你可以使用filter()方法来获取数据框中的有效/无效记录。从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)

1
我认为这只支持Spark 2.x,因为我在编译时出现了错误。过载的方法值filter有多个选择:(conditionExpr: String)org.apache.spark.sql.DataFrame <and> (condition: org.apache.spark.sql.Column)org.apache.spark.sql.DataFrame不能应用于(org.apache.spark.sql.Row ⇒ Boolean)。 我正在使用Spark 1.6,是否有Spark 1.6中的替代方案? - Kalpesh

2

这里我们定义了一个函数,用于检查一个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)

0
使用 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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接