You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark中如何将values值与日期序列逐一映射关联?

问题描述

输入数据

IdFirstDateLastDatevalues
12023-12-102023-12-142,4,6,7,8
22024-01-122023-12-210,0,16,2,7,0,1,1,2,3

期望输出

IdFirstDateAndLastDatevalue
12023-12-102
12023-12-114
12023-12-126
12023-12-137
12023-12-148
22024-01-120
22024-01-130
22024-01-1416
22024-01-152
22024-01-167
22024-01-170
22024-01-181
22024-01-191
22024-01-202
22024-01-213

当前已能通过代码生成日期序列,也能拆分values字段,但无法将两者按位置一一关联:

df.withColumn("FirstDateAndLastDate", explode(expr("sequence(to_date(FirstDate), to_date(LastDate), interval 1 day)")))
df.withColumn("new_value", explode(split(col("values"), ",")))

解决方案

核心思路是先将日期序列和拆分后的values数组按索引配对,再炸开配对后的结构体数组,实现一一映射:

from pyspark.sql import functions as F
from pyspark.sql.functions import expr

# 1. 生成日期序列数组与values拆分后的数组,用arrays_zip按索引配对
# 2. 炸开配对后的结构体数组
# 3. 提取结构体中的日期和值字段,并重命名、转换类型
result_df = df.withColumn(
    "date_value_pair",
    expr("arrays_zip(sequence(to_date(FirstDate), greatest(to_date(FirstDate), to_date(LastDate)), interval 1 day), split(values, ','))")
).withColumn(
    "date_value_pair",
    F.explode("date_value_pair")
).select(
    "Id",
    F.col("date_value_pair.0").alias("FirstDateAndLastDate"),
    F.col("date_value_pair.1").cast("int").alias("value")
)

result_df.show()

关键说明

  • arrays_zip:将两个数组按索引位置一一配对,生成包含日期和对应值的结构体数组
  • greatest(to_date(FirstDate), to_date(LastDate)):处理输入中LastDate早于FirstDate的异常情况(如Id=2的输入),确保日期序列从较早的日期开始生成
  • 最后通过select提取结构体中的字段,并将value转为整数类型(根据需求可选)

内容的提问来源于stack exchange,提问作者Sandesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:52:46