无法使用Spark中的Window函数过滤DataFrame

时间:2017-06-15 06:29:44

标签: scala apache-spark

我尝试使用基于窗口函数的逻辑表达式来检测重复记录:

df
.where(count("*").over(Window.partitionBy($"col1",$"col2"))>lit(1))
.show

这在Spark 2.1.1中给出:

java.lang.ClassCastException: org.apache.spark.sql.catalyst.plans.logical.Project cannot be cast to org.apache.spark.sql.catalyst.plans.logical.Aggregate

另一方面,如果我将窗口函数的结果分配给新列,然后过滤该列,它就可以工作:

df
.withColumn("count", count("*").over(Window.partitionBy($"col1",$"col2"))
.where($"count">lit(1)).drop($"count")
.show

我想知道如何在不使用临时列的情况下编写它?

1 个答案:

答案 0 :(得分:2)

我猜窗口函数不能在过滤器中使用。您必须创建一个额外的列并过滤此列。

您可以做的是将窗口功能绘制到选择中。

df.select(col("1"), col("2"), lag(col("2"), 1).over(window).alias("2_lag"))).filter(col("2_lag")==col("2"))

然后你有一个声明。