【问题标题】:Getting the maximum value of a column in an Apache Spark Dataframe (Scala)获取 Apache Spark Dataframe (Scala) 中列的最大值
【发布时间】:2020-03-03 08:44:43
【问题描述】:

我正在尝试获取列中的最大值,并编写了以下代码。

val max = df.withColumn("max", lit(df.agg(max($"id")).as[Int].first))

不幸的是,当我运行它时,我收到以下错误:

error: recursive value max needs type
val max = df.withColumn("max", lit(df.agg(max($"id")).as[Int].first))

我真的不明白错误告诉我什么,我找不到有关此功能的任何好的文档。我写错了吗?或者也许有更好的方法来做到这一点?我一直在尝试获得具体的例子,但似乎没有什么对我有用。

【问题讨论】:

  • 这能回答你的问题吗? Recursive value xxx needs type in Scala
  • 你为什么使用withColumn
  • @Lamanus 我想最终将值添加到新列中
  • @AMC 虽然这不能回答我的具体问题,但它确实表明我使用的是 Scala Max 函数而不是 Apache Spark Max 函数,正如接受的答案中所指出的那样下面。

标签: apache-spark apache-spark-sql


【解决方案1】:

在您的代码中,spark max 被误认为是 scala max,所以我只是指定 max 来自 spark。

这将为您提供 id 列的最大值作为整数值:

%scala
import org.apache.spark.sql.functions.col

val max = df.agg(org.apache.spark.sql.functions.max(col("id"))).collect()(0)(0).asInstanceOf[Int]

Output: max: Int = 6

如果要创建列来存储 id 的最大值:

%scala
import org.apache.spark.sql.functions._
df.withColumn("max", lit(df.agg(org.apache.spark.sql.functions.max($"id")).as[Int].first))

【讨论】:

  • 非常感谢,我认为这会起作用,但是 collect()(0)(0) 函数究竟是做什么的?
  • 它只是将第一个元素的第一个值收集回驱动节点,因为最初我以为你只是想要这个值。你可以用 first() 代替
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2017-06-02
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多