验证 pyspark 中数据框列中的日期格式

Swa*_*ilM 2 apache-spark apache-spark-sql pyspark

我有一个数据框,其列为“日期”以及其他一些列。

我想验证日期列值并检查格式是否为“dd/MM/yyyy”。如果日期列具有任何其他格式,则应将其标记为错误记录。因此,我使用选项option("dateFormat", "dd/MM/yyyy")接受上述格式的日期,并且它以“dd/MM/yyyy”格式正确接受日期,但如果我传递无效格式 (YYYY/ mm/dd) 仍然记录未标记为无效,并且传递的日期正在转换为垃圾

输入文件 :

colData1,2020/05/07,colData2,colData3
colData4,2020/05/07,colData5,colData6
colData7,2020/05/07,colData8,colData9
Run Code Online (Sandbox Code Playgroud)
    df = spark.read.format(
        "com.databricks.spark.csv").schema(customSchema).option(
        "escape", '\"').option(
        "quote", '\"').option(
        "header", "false").option(
        "dateFormat", "dd/MM/yyyy").option(
        "columnNameOfCorruptRecord","badRecords").csv(
        rdd)

    df.show()

Run Code Online (Sandbox Code Playgroud)

数据帧 O/P :-

+--------+----------+--------+--------+----------+-----+
|    OMIC|      SMIC|    VCLP|   VName|badRecords|rowId|
+--------+----------+--------+--------+----------+-----+
|colData1|0012-11-09|colData2|colData3|      null|    0|
|colData4|0012-11-09|colData5|colData6|      null|    1|
|colData7|0012-11-09|colData8|colData9|      null|    2|
+--------+----------+--------+--------+----------+-----+
Run Code Online (Sandbox Code Playgroud)

请建议

chl*_*bek 7

您无法通过dateFormat选项实现它,它接受2020/05/07但将格式更改为 invalid 0012-11-09。您可以尝试将SMIC列类型更改为StringType架构中的列类型,然后使用 function 将其转换为正确格式的日期to_date

from pyspark.sql import functions as f
df2 = df.withColumn("badRecord", f.when(f.to_date(f.col("SMIC"),"dd/MM/yyyy").isNotNull, False).otherwise(True))
Run Code Online (Sandbox Code Playgroud)

输出:

+--------+----------+--------+--------+---------+
|    OMIC|      SMIC|    VCLP|   VName|badRecord|
+--------+----------+--------+--------+---------+
|colData1|2020/05/07|colData2|colData3|     true|
|colData4|2020/05/07|colData5|colData6|     true|
|colData7|2020/05/07|colData8|colData9|     true|
|colData7|07/05/2020|colData8|colData9|    false|
+--------+----------+--------+--------+---------+
Run Code Online (Sandbox Code Playgroud)