2017-06-15 121 views
2

數據幀過濾我嘗試使用基於窗口功能的邏輯表達式來檢測重複記錄:在星火2.1.1無法使用窗口功能星火

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

這給:

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)) 
.show 

我想知道如何在不使用臨時列的情況下編寫此代碼?

回答

0

我猜窗口函數不能在過濾器中使用。你必須創建一個額外的列並過濾這一個。

你可以做的是將窗口函數繪製到select中。

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

然後你在一個聲明中有它。