web-dev-qa-db-ja.com

Spark Scala Appの同じデータフレームの日付列に日数列を追加します

dataframe _("id", "current_date", "days")_のcolumns dfがあり、「days」を「_current_date_」に追加して新しいものを作成しようとしています。 dataframe with new column called "_new_date_" using spark scala function date_add()

_val newDF = df.withColumn("new_Date", date_add(df("current_date"), df("days").cast("Int")))
_

しかし、関数_date_add_はInt値のみを受け入れ、columnsは受け入れないように見えます。このような場合、どのようにして目的の出力を得ることができますか?目的の出力を取得するために使用できる代替機能はありますか?

sparkバージョン:1.6.0 scalaバージョン:2.10.6

7
qubiter

小さなカスタム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|
+---+------------+----+----------+
3
rogue-one

UDFを使用する必要はありません。SQL式を使用して使用できます。

val newDF = df.withColumn("new_date", expr("date_add(current_date,days)"))
14
Raphael Roth