我有一个带有一个DateTime列和许多其他列的数据框。
我想要做的就是解析此DateTime列值并检查格式是否为"yyyy-MM-dd HH:mm:ss"
。如果是这样,那么我想在一个数据帧中使用这些有效记录。
如果DateTime列包含格式"yyyy-MM-dd HH:mm:ss"
以外的任何值。我想在其他数据帧中使用那些无效记录。
感谢。
答案 0 :(得分:3)
您可以使用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)
答案 1 :(得分:1)
这里我们定义一个函数来检查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)
答案 2 :(得分: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")