当我在
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吗?
请尝试
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|
+-------+----------+
您可以尝试以下
pandas_udf
。它可以使用最新的 Spark 版本,但我可以从您使用早于 Spark 3 版本的结果中看到。我使用了这个函数,因为在某些情况下,即使在 Spark 3 中也无法做到这一点。Spark 从 2.4 版本到 3 版本在日期时间方面发生了很大变化。
如果该功能完全有效,则您的情况可能需要进行调整。 这里
是格式代码。
format
据我了解,如果解析的年份与解析的年份第一周的第一天的 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
然后使用格式解析它
-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
)
)