【发布时间】:2021-01-28 02:36:37
【问题描述】:
我是 Stack Overflow 的新手,也是编程的新手。我正在学习 Scala。 我有以下数据框:
| id | From | To |
|---|---|---|
| James | 2021-01-09 | 2021-01-15 |
| James | 2021-01-14 | 2198-01-01 |
| James | 2021-01-22 | null |
| Sara | 2021-01-16 | 2198-01-01 |
| Sara | 2021-02-23 | null |
我需要找到to 值设置为2198-01-01 的行,并使用from 值更新它们,其中to 列是null 的每个id 组。例如,对于 James,第 2 行中的 to 值将使用第 3 行中的 from 值进行更新。
期望的输出:
| id | From | To |
|---|---|---|
| James | 2021-01-09 | 2021-01-15 |
| James | 2021-01-14 | 2021-01-22 |
| James | 2021-01-22 | null |
| Sara | 2021-01-16 | 2021-02-23 |
| Sara | 2021-02-23 | null |
我编写了一个提取值的函数,但我正在努力为每个 id 组应用此函数。
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.{Column, DataFrame}
import org.apache.spark.sql.types.StringType
val df = Seq(
("James", "2021-01-09", "2021-01-15"),
("James", "2021-01-14", "2198-01-01"),
("James", "2021-01-22", null),
("Sara", "2021-01-16", "2198-01-01"),
("Sara", "2021-02-23", null)
).toDF("id", "from", "to")
def myFunc1(df: DataFrame) = {
val strs = df.select("from").where($"to".isNull).as[String].collect
strs(0)
}
def extractValue(df: DataFrame)= {
df.withColumn(
"id",
when(
$"to" === "2198-01-01",
myFunc1(df))
)}
我以为我可以做类似df.groupBy("id").transform(extractValue(df)) 的事情,但这不起作用。
感谢您的帮助!
编辑:每组总是至少有一行带有null 值和一行带有2198-01-01 值。如果有多个 null 值,我需要从 value 中获取最新的值并使用它进行更新
【问题讨论】:
-
如果
to和2198-01-01一样,它是否总是有一个空值?如果有多个空值怎么办? -
是的,总会有至少一行具有空值和一行具有 2198-01-01 值。如果有多个 null 值,我需要从 value 中获取最新的值并使用它进行更新。
-
排序是什么,怎么知道最新的?
-
这是一个日期,所以是最新的日期。例如:如果有 ("Sara", "2021-02-23", null) 和 ("Sara", "2021-02-25", null) 2021-02-25 是较新的日期。
标签: scala apache-spark apache-spark-sql