spark 按某幾列distinct去重、topN、視窗計算的應用
阿新 • • 發佈:2019-02-09
在spark計算當中,我們日常有些簡單需求,比如去重,比如有四列(appid、date、type、platform),我們只需要對appid,date進行去重,另外兩列不關注。在spark中,distinct會對所有列執行去重操作,兩行比較,只要有個一列有差異,就不算重複。
要解決,只對某幾列進行去重,可以使用Top N 的思路,也就是先分組,分組後,我們只取row_num=1第一行就可以了。
具體實現程式碼如下:
//選出某幾列,去掉空值 Dataset<Row> dataset = input.select( Consts.Fields.APPID, Consts.Fields.EXT$ADID ).na().drop(dropNulCol); dataset.persist(); //設定視窗計算,可以指定多個列為partitionBy,其實就是多個groupby 分組列 WindowSpec w=Window.partitionBy(Consts.Fields.APPID).orderBy(col("count").desc()); //只取row num=1,那就是top N,如果window裡有orderby排序的話。 Dataset<Row> top = count.withColumn("rn",row_number().over(w)).where(col("rn").$eq$eq$eq(1)).drop("rn");