1. 程式人生 > >spark 按某幾列distinct去重、topN、視窗計算的應用

spark 按某幾列distinct去重、topN、視窗計算的應用

        在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");