您如何发现 spark 数据框中列格式的异常?
How do you find anomalies in format of a column in a spark dataframe?
如问题所述,我想在大型数据集中的列中查找值格式的异常。
例如:如果我在一个包含 5 亿行的数据集中有一个日期列,我想确保该列中所有行的日期格式都是 MM-DD-YYYY。我想找到这种格式存在异常的计数和值。
我该怎么做呢?我可以使用正则表达式吗?有人可以举个例子吗?想要使用 Spark Dataframe 执行此操作。
使用正则表达式进行正确的日期格式验证可能很棘手(参见:Regex to validate date format dd/mm/yyyy), but you can use Joda-Time 如下:
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()
如问题所述,我想在大型数据集中的列中查找值格式的异常。
例如:如果我在一个包含 5 亿行的数据集中有一个日期列,我想确保该列中所有行的日期格式都是 MM-DD-YYYY。我想找到这种格式存在异常的计数和值。
我该怎么做呢?我可以使用正则表达式吗?有人可以举个例子吗?想要使用 Spark Dataframe 执行此操作。
使用正则表达式进行正确的日期格式验证可能很棘手(参见:Regex to validate date format dd/mm/yyyy), but you can use Joda-Time 如下:
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()