Scala 表达式';id';既不存在于group by中,也不是聚合函数
使用Scala和Spark 1.6.3,我的错误消息是:Scala 表达式';id';既不存在于group by中,也不是聚合函数,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,使用Scala和Spark 1.6.3,我的错误消息是: org.apache.spark.sql.AnalysisException:表达式“id”既不在group by中,也不是聚合函数。 如果您不在乎获得哪个值,则添加到group by或wrap in first()(或first_值)。; 生成错误的代码是: returnDf.withColumn("colName", max(col("otherCol")) DataFrame returnDf如下所示: +---+-------
org.apache.spark.sql.AnalysisException:表达式“id”既不在group by中,也不是聚合函数。
如果您不在乎获得哪个值,则添加到group by或wrap in first()(或first_值)。;
生成错误的代码是:
returnDf.withColumn("colName", max(col("otherCol"))
DataFrame returnDf如下所示:
+---+--------------------+
|id | otherCol|
+---+--------------------+
|1.0|[0.0, 0.217764172...|
|2.0| [0.0, 0.0]|
|3.0|[0.0, 0.142646382...|
|4.0|[0.63245553203367...|
当出现这种情况时,有一个解决方案。使用我上面使用的语法(即
withColumn()
函数)的等效解决方案是什么?问题是max
是一个聚合函数,它返回列的最大值,而不是该列中每行数组的最大值
要获得阵列的最大值,正确的解决方案是使用UDF:
returnDf.withColumn("colName", udf((v : Seq[Double]) => v.max).apply(col("otherCol")))
在使用聚合函数之前,需要执行groupBy操作:
returnDf.groupBy(col(“id”)).agg(max(“otherCol”))那么您实际上是在数组中寻找一个最大值,不是吗?如果是这样的话,您根本不能使用
max
(这并不是说它可以应用于数组
列)。在2.4中,您可以使用高阶函数,但在1.6中,您必须像udf((xs:Seq[Double]=>xs.max)
一样使用udf
。为了让其他人更容易阅读您的答案,请尝试对代码段使用代码格式。有关信息,请参阅。