PySpark to_date 函数在一年中的第 1 周返回 null

问题描述 投票:0回答:3

当我在

to_date
函数中使用一年中的第几周时,一年中的第一周多年来都会返回 null。

df=pyrasa.sparkSession.createDataFrame([["2013-01"],["2013-02"],["2017-01"],["2018-01"]],["input"])
df.select(func.col("input"),func.to_date(func.col("input"),"yyyy-ww").alias("date")) \
  .show()
+-------+----------+
|  input|      date|
+-------+----------+
|2013-01|      null|
|2013-02|2013-01-06|
|2017-01|2017-01-01|
|2018-01|      null|
+-------+----------+

这是为什么呢?是

to_date
函数的bug吗?

apache-spark datetime pyspark apache-spark-sql week-number
3个回答
0
投票

请尝试

spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")

df.withColumn('date', expr("date(input)")).show()

+-------+----------+
|  input|      date|
+-------+----------+
|2013-01|2013-01-01|
|2013-02|2013-02-01|
|2017-01|2017-01-01|
|2018-01|2018-01-01|
+-------+----------+

0
投票

您可以尝试以下

pandas_udf
。它可以使用最新的 Spark 版本,但我可以从您使用早于 Spark 3 版本的结果中看到。我使用了这个函数,因为在某些情况下,即使在 Spark 3 中也无法做到这一点。Spark 从 2.4 版本到 3 版本在日期时间方面发生了很大变化。

如果该功能完全有效,则您的情况可能需要进行调整。

这里

是格式代码。
format

据我了解,如果解析的年份与解析的年份第一周的第一天的 

0
投票
的年份不同,则

from pyspark.sql import functions as F import pandas as pd @F.pandas_udf('date') def year_week_to_date(year_week: pd.Series) -> pd.Series: return pd.to_datetime(year_week + '-1', format='%G-%V-%u') df = df.withColumn('date', year_week_to_date(F.col('input'))) df.show() # +-------+----------+ # | input| date| # +-------+----------+ # |2013-01|2012-12-31| # |2013-02|2013-01-07| # |2017-01|2017-01-02| # |2018-01|2018-01-01| # +-------+----------+

 返回 null。
这里有一个解决方法来克服这个问题:

首先,通过在要解析的字符串中添加

to_date
    来解析一周的最后一天,确保解析的年份与 ISO 周日期年份相同
  • 然后使用格式解析它 
    -06
  • 然后使用 
    yyyy-ww-uu
  • 检索六天以获得一周的第一天
    所以,完整的代码是:
date_add

然后,您将通过输入 df 得到以下结果:
from pyspark.sql import functions as F

df.withColumn(
  'date', 
  F.date_add(
    F.to_date(F.concat(F.col("input"), F.lit("-06")), "yyyy-ww-uu"), 
    -6
  )
)


© www.soinside.com 2019 - 2024. All rights reserved.