Spark中如何将列值(天数)添加至日期列?
在Spark中使用整数列作为
date_add的天数参数 没问题,这事儿其实特别简单——date_add函数本来就支持直接用整数列作为第二个参数,根本不用额外的复杂操作!你之前可能误以为只能传固定整数,但它的参数定义里明确写了接受tinyint/smallint/int类型的输入,不管是固定值还是列都可以。
下面直接给你完整的可运行代码示例,对应你提供的DataFrame:
import org.apache.spark.sql.functions.date_add import org.apache.spark.sql.types.DateType // 创建你给出的示例DataFrame,顺便给列起个直观的名字 val data = Seq( (0, "2016-01-01"), // 原日期补全为标准格式 (1, "2016-02-02"), (2, "2016-03-22"), (3, "2016-04-25"), (4, "2016-05-21"), (5, "2016-06-01"), (6, "2016-03-21") ).toDF("days_to_add", "start_date_str") // 步骤分解: // 1. 先把字符串类型的日期转成Spark的Date类型(date_add要求第一个参数是日期列) // 2. 直接用days_to_add列作为date_add的第二个参数,生成新日期列 val resultDF = data .withColumn("start_date", $"start_date_str".cast(DateType)) .withColumn("new_date", date_add($"start_date", $"days_to_add")) .select("days_to_add", "start_date", "new_date") // 只保留需要的列查看结果 // 打印结果看看 resultDF.show()
运行后会得到这样的输出:
+-----------+----------+----------+ |days_to_add|start_date| new_date| +-----------+----------+----------+ | 0|2016-01-01|2016-01-01| | 1|2016-02-02|2016-02-03| | 2|2016-03-22|2016-03-24| | 3|2016-04-25|2016-04-28| | 4|2016-05-21|2016-05-25| | 5|2016-06-01|2016-06-06| | 6|2016-03-21|2016-03-27| +-----------+----------+----------+
小补充
如果你的天数列类型不是int(比如是long),只需要加个类型转换就行:
.withColumn("new_date", date_add($"start_date", $"days_to_add".cast(IntegerType)))
内容的提问来源于stack exchange,提问作者Mrgr8m4
相关产品推荐
相关产品推荐

