在同一个数据帧到日期列日列的添加号星火斯卡拉应用
问题描述:
我有DF的dataframe
columns
("id", "current_date", "days")
,我尝试添加了“days
”为“current_date
”,并创建一个新的dataframe
新column
称为“new_date
”使用火花阶功能date_add()
在同一个数据帧到日期列日列的添加号星火斯卡拉应用
val newDF = df.withColumn("new_Date", date_add(df("current_date"), df("days").cast("Int")))
不过貌似功能date_add
只接受Int
值,而不是columns
。在这种情况下如何获得所需的输出?有什么替代功能我可以用来获得所需的输出?
火花版本:1.6.0 斯卡拉版本:2.10.6
答
一个小的定制可以使用UDF,使这个日期计算成为可能。
import org.apache.spark.sql.functions.udf
import java.util.concurrent.TimeUnit
import java.util.Date
import java.text.SimpleDateFormat
val date_add = udf((x: String, y: Int) => {
val sdf = new SimpleDateFormat("yyyy-MM-dd")
val result = new Date(sdf.parse(x).getTime() + TimeUnit.DAYS.toMillis(y))
sdf.format(result)
})
使用:
scala> val df = Seq((1, "2017-01-01", 10), (2, "2017-01-01", 20)).toDF("id", "current_date", "days")
df: org.apache.spark.sql.DataFrame = [id: int, current_date: string, days: int]
scala> df.withColumn("new_Date", date_add($"current_date", $"days")).show()
+---+------------+----+----------+
| id|current_date|days| new_Date|
+---+------------+----+----------+
| 1| 2017-01-01| 10|2017-01-11|
| 2| 2017-01-01| 20|2017-01-21|
+---+------------+----+----------+
答
无需使用UDF,您可以使用SQL表达式做到这一点:
val newDF = df.withColumn("new_date", expr("date_add(current_date,days)"))
+0
你甚至可以跳过'expr'并直接使用(在spark 2.1+中) 'val newDF = df.withColumn(“new_date”,date_add($“current_date”,days))' –
谢谢。这个解决方案对我来说很完美。 – qubiter