【问题标题】:Apply functions on each group in Data Frame在数据框中的每个组上应用函数
【发布时间】: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 中获取最新的值并使用它进行更新

【问题讨论】:

  • 如果to2198-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


【解决方案1】:

您可以使用when 屏蔽不相关的值,并获取max From 日期,其中To 为空:

import org.apache.spark.sql.expressions.Window

val df2 = df.withColumn(
    "To",
    when(
        $"to" === lit("2198-01-01"),
        max(when($"To".isNull, $"From")).over(Window.partitionBy("id"))
    ).otherwise($"to")
)

df2.show
+-----+----------+----------+
|   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|
+-----+----------+----------+

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 2011-06-15
    • 2016-02-04
    • 2022-01-07
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多