【发布时间】:2020-06-21 18:16:15
【问题描述】:
我有一个 Spark 数据框,其中几列具有不同类型的日期格式。
为了解决这个问题,我编写了下面的代码,以保持所有日期列的格式类型一致。
由于日期列的日期格式每次都可能发生变化,因此我在dt_formats 中定义了一组日期格式。
def to_timestamp_multiple(s: Column, formats: Seq[String]): Column = {
coalesce(formats.map(fmt => to_timestamp(s, fmt)):_*)
}
val dt_formats= Seq("dd-MMM-yyyy", "MMM-dd-yyyy", "yyyy-MM-dd","MM/dd/yy","dd-MM-yy","dd-MM-yyyy","yyyy/MM/dd","dd/MM/yyyy")
val newDF = df.withColumn("ETD1", date_format(to_timestamp_multiple($"ETD",Seq("dd-MMM-yyyy", dt_formats)).cast("date"), "yyyy-MM-dd")).drop("ETD").withColumnRenamed("ETD1","ETD")
但是在这里我必须创建一个新列然后我必须删除旧列然后重命名新列。 这使代码变得不必要非常笨拙,因此我想从此代码中覆盖。
我正在尝试通过在函数下面编写一个 Scala 来实现类似的功能,但它抛出异常 org.apache.spark.sql.catalyst.parser.ParseException:,但我无法确定我应该进行哪些更改才能使其工作..
val CleansedData= rawDF.selectExpr(rawDF.columns.map(
x => { x match {
case "ETA" => s"""date_format(to_timestamp_multiple($x, dt_formats).cast("date"), "yyyy-MM-dd") as ETA"""
case _ => x
} } ) : _*)
因此寻求帮助。 提前致谢。
【问题讨论】:
标签: scala apache-spark apache-spark-sql simpledateformat