【问题标题】:Validate date format in a dataframe column in pyspark验证 pyspark 中数据框列中的日期格式
【发布时间】:2021-10-29 00:19:35
【问题描述】:

我有一个数据框,其列为 Date 以及其他几列。

我想验证日期列值并检查格式是否为“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
    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()

DataFrame 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|
+--------+----------+--------+--------+----------+-----+

请推荐

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您无法使用dateFormat 选项实现它,它接受2020/05/07 但将格式更改为无效0012-11-09。您可以尝试将架构中的SMIC 列类型更改为StringType,然后使用函数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))
    

    输出:

    +--------+----------+--------+--------+---------+
    |    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|
    +--------+----------+--------+--------+---------+
    

    【讨论】:

    • 感谢您的回复!您能否解释一下为什么无法使用 dateFormat 进行验证,我很困惑为什么它会生成垃圾日期?可能是因为时区
    • 这里是什么?
    • @MohitSinha from pyspark.sql import functions as F
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多