PySpark DataFrame中基于Name列字符生成递增日期的问题排查
问题解决
你的需求是把Name列拆成单个字符,每个字符对应Date列依次递增1天。原来的代码报错是因为在withColumn里用Python lambda生成器完全不符合Spark的列操作逻辑,而且x根本没被定义,所以抛出NameError。
正确的做法是给拆分后的每个字符标记递增的序号,再用这个序号来计算日期偏移:
完整代码
from pyspark.sql import functions as F from pyspark.sql.window import Window # 拆分Name为单个字符并展开,过滤空字符 df_withchars = df.withColumn("Character", F.explode(F.split("Name", "")))\ .filter(F.col("Character") != "") # 定义窗口:按原行的Name和Date分组,给拆分后的字符标记顺序序号 window_spec = Window.partitionBy("Name", "Date").orderBy(F.monotonically_increasing_id()) # 计算日期偏移量,生成最终的New_Date列 result_df = df_withchars.withColumn("day_offset", F.row_number().over(window_spec) - 1)\ .withColumn("New_Date", F.date_add(F.col("Date"), F.col("day_offset")))\ .drop("day_offset", "Name", "Date") result_df.show()
代码说明
F.split("Name", "")将Name拆分为单个字符的数组,F.explode把数组展开为多行,每个字符对应一行- 窗口函数
row_number().over(window_spec)给原行拆分后的字符标记1、2、3...的序号,减1后得到日期偏移量(第一个字符偏移0天,第二个偏移1天,以此类推) F.date_add是Spark内置的日期操作函数,直接对Date列加上偏移量得到目标日期
运行后就能得到你想要的输出:
+---------+-----------+ |Character| New_Date| +---------+-----------+ | P|1986-May-29| | E|1986-May-30| | T|1986-May-31| | E|1986-Jun-01| | R|1986-Jun-02| +---------+-----------+
内容的提问来源于stack exchange,提问作者SDE
相关产品推荐
相关产品推荐

