在我的pyspark dataframe中,有一个数据类型为string的列CallDate,其中包含如下所示的值:

2008-04-01T00:00:00
2008-04-01T00:00:00
2008-04-01T00:00:00
2008-04-01T00:00:00
2008-04-01T00:00:00
2008-04-01T00:00:00

我try 使用pyspark.sql.functions.to_timestamp()将此列从数据类型string转换为timestamp.

当我运行此代码时:

df.withColumn('IncidentDate', to_timestamp(col('CallDate'), 'yyyy/MM/dd')).select('CallDate', 'IncidentDate').show()

...我将获得以下输出:

+-------------------+------------+
|           CallDate|IncidentDate|
+-------------------+------------+
|2008-04-01T00:00:00|        NULL|
|2008-04-01T00:00:00|        NULL|
|2008-04-01T00:00:00|        NULL|
|2008-04-01T00:00:00|        NULL|
|2008-04-01T00:00:00|        NULL|
|2008-04-01T00:00:00|        NULL|

我认为NULL个值是因为为日期指定的格式与实际日期字符串不一致,由于没有找到匹配项,所以返回NULL个值.

但当我运行这段代码时:

df.withColumn('IncidentDate', to_timestamp(col('CallDate'), 'yyyy-MM-dd')).select('CallDate', 'IncidentDate').show()

我得到一个错误,

Caused by: org.apache.spark.SparkUpgradeException: [INCONSISTENT_BEHAVIOR_CROSS_VERSION.PARSE_DATETIME_BY_NEW_PARSER] You may get a different result due to the upgrading to Spark >= 3.0:
Fail to parse '2008-04-01T00:00:00' in the new parser. You can set "spark.sql.legacy.timeParserPolicy" to "LEGACY" to restore the behavior before Spark 3.0, or set to "CORRECTED" and treat it as an invalid datetime string.

我知道正确的解析格式应该是"yyyy-MM-dd'T'HH:mm:ss",如下所示:

df.withColumn('IncidentDate', to_timestamp(col('CallDate'), "yyyy-MM-dd'T'HH:mm:ss")).select('CallDate', 'IncidentDate').show()

但我的问题是,为什么当我将日期解析格式设置为yyyy/MM/dd时,Spark会返回NULL值,而当我将其设置为yyyy-MM-dd时,它会抛出错误?

推荐答案

发生这种情况是因为当您使用格式yyyy/MM/dd时,旧的和新的日期时间解析器都无法解析输入,因此无论Spark(及其解析器)版本如何,在这两种情况下的结果都是NULL.然而,对于yyyy-MM-dd格式,旧的解析器更宽松,返回一个有效值,而新的解析器仍然失败并返回NULL.Spark通过内部判断来检测这种情况,并创建和抛出一个非常特殊的SparkUpgradeException,其中包含一个非常具体的消息,以吸引您对潜在回归问题的注意力.更多关于Spark 3.x中新的解析逻辑,以及spark.sql.legacy.timeParserPolicy config的效果可以在Spark Migration Guide和/或源代码中找到.

Python相关问答推荐

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

Tkinter滑动条标签.我不确定如何删除滑动块标签或更改其文本

使用多个性能指标执行循环特征消除

Python中的函数中是否有充分的理由接受float而不接受int?

Locust请求中的Python和参数

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

仅从风格中获取 colored颜色 循环

Pydantic 2.7.0模型接受字符串日期时间或无

对某些列的总数进行民意调查,但不单独列出每列

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

实现自定义QWidgets作为QTimeEdit的弹出窗口

如何设置视频语言时上传到YouTube与Python API客户端

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

如何从需要点击/切换的网页中提取表格?

如何杀死一个进程,我的Python可执行文件以sudo启动?

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

Discord.py -

以异步方式填充Pandas 数据帧