验证严格格式的日期 - 年份超过 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)
我的期望是代码应该 return False,因为 YYYY 是一个四字符日期,但代码 returns True 并将转换后的年份打印为有效年份。
无论如何我可以对日期进行严格验证吗?
注意:格式由用户配置,将是动态的。
试过 to_timestamp 和 to_date 都有相同的输出
这是自 2.4 以来的错误,并已从 3.0 向前修复。更多信息 here。简而言之,有一个名为 spark.sql.legacy.timeParserPolicy
的配置,有 3 个可能的值:
LEGACY
: 像 2.4 那样执行你看到错误的地方
EXCEPTION
:格式无效时引发异常
CORRECTED
:修复并return您的预期结果
这是 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 |
+-----------+------+---------------+--------------+
我正在尝试根据配置的日期格式(使用 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)
我的期望是代码应该 return False,因为 YYYY 是一个四字符日期,但代码 returns True 并将转换后的年份打印为有效年份。
无论如何我可以对日期进行严格验证吗?
注意:格式由用户配置,将是动态的。
试过 to_timestamp 和 to_date 都有相同的输出
这是自 2.4 以来的错误,并已从 3.0 向前修复。更多信息 here。简而言之,有一个名为 spark.sql.legacy.timeParserPolicy
的配置,有 3 个可能的值:
LEGACY
: 像 2.4 那样执行你看到错误的地方EXCEPTION
:格式无效时引发异常CORRECTED
:修复并return您的预期结果
这是 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 |
+-----------+------+---------------+--------------+