簡體   English   中英

嚴格按照格式驗證日期 - 年份超過 4 個字符 - pySpark

[英]Validate Date strict to format - more than 4 character for year - pySpark

我正在嘗試根據配置的日期格式(使用 to_timestamp /to_date)驗證文件中收到的日期。

schema = StructType([ \
    StructField("date",StringType(),True), \
    StructField("active", StringType(), True)
    ])

input_data = [
    ("27/10/00",'Y'),
    ("27/10/01",'Y'),
    ("27/10/1",'Y'),
    ("27/10/16",'Y'),
    ("27/10",'Y'),
    ("27/10/99",'Y'),
    ("27/10/100",'Y'),
    ("27/10/992",'Y'),
    ("27/10/2000",'Y'),
    ("27/10/9999",'Y'),
    ("27/10/20015",'Y'), ]
date_format = "dd/MM/yyyy"

temp_df = spark.createDataFrame(data=input_data,schema=schema)

df = temp_df.select('*', 
                f.when(f.date_format(f.to_timestamp(f.col('date'), date_format), date_format).isNotNull(), True).otherwise(False).alias('Date_validation'),
                f.date_format(f.to_timestamp(f.col('date'), date_format), date_format).alias('converted_date'),
                )
df.show(truncate=False)

我的期望是代碼應該返回 False,因為 YYYY 是一個四字符日期,但代碼返回 True 並將轉換后的年份打印為有效年份。

在此處輸入圖像描述

無論如何我可以對日期進行嚴格的驗證嗎?

注意:格式由用戶配置,這將是動態的。

嘗試 to_timestamp 和 to_date 都具有相同的 output

這是自 2.4 以來的錯誤,並已從 3.0 向前修復。 更多信息在這里 簡而言之,有一個名為spark.sql.legacy.timeParserPolicy的配置,有 3 個可能的值:

  • LEGACY :在你看到錯誤的地方像 2.4 一樣執行
  • EXCEPTION :當格式無效時引發異常
  • CORRECTED :修復並返回您的預期結果

這是CORRECTED的結果:

+-----------+------+---------------+--------------+
|date       |active|Date_validation|converted_date|
+-----------+------+---------------+--------------+
|27/10/00   |Y     |false          |null          |
|27/10/01   |Y     |false          |null          |
|27/10/1    |Y     |false          |null          |
|27/10/16   |Y     |false          |null          |
|27/10      |Y     |false          |null          |
|27/10/99   |Y     |false          |null          |
|27/10/100  |Y     |false          |null          |
|27/10/992  |Y     |false          |null          |
|27/10/2000 |Y     |true           |27/10/2000    |
|27/10/9999 |Y     |true           |27/10/9999    |
|27/10/20015|Y     |false          |null          |
+-----------+------+---------------+--------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM