我在 StackOverflow 上发表了一篇关于返回由另一列分组的列的最大值的帖子,并得到了一个意外的 Java 异常。
以下是测试数据:
import pyspark.sql.functions as f
data = [('a', 5), ('a', 8), ('a', 7), ('b', 1), ('b', 3)]
df = spark.createDataFrame(data, ["A", "B"])
df.show()
+---+---+
| A| B|
+---+---+
| a| 5|
| a| 8|
| a| 7|
| b| 1|
| b| 3|
+---+---+
这是据称适用于其他用户的解决方案:
from pyspark.sql import Window
w = Window.partitionBy('A')
df.withColumn('maxB', f.max('B').over(w))
.where(f.col('B') == f.col('maxB'))
.drop('maxB').show()
这应该产生这个输出:
#+---+---+
#| A| B|
#+---+---+
#| a| 8|
#| b| 3|
#+---+---+
相反,我得到:
java.lang.UnsupportedOperationException: Cannot evaluate expression: max(input[2, bigint, false]) windowspecdefinition(input[0, string, true], specifiedwindowframe(RowFrame, unboundedpreceding$(), unboundedfollowing$()))
我只在Databricks上的Spark 2.4上尝试过这个。我尝试了等效的SQL语法并得到了相同的错误。
Databricks 支持能够在 Spark 2.4 上重现该问题,但在早期版本上则无法重现。显然,这是由于制定物理计划的方式不同(如果需要,我可以发布他们的回复)。计划进行修复。
同时,这是原始问题的一种替代解决方案,它不会成为 2.4 版问题的牺牲品:
df.withColumn("maxB", f.max('B').over(w)).drop('B').distinct().show()
+---+----+
| A|maxB|
+---+----+
| b| 3|
| a| 8|
+---+----+