1. 程式人生 > >hive,spark獲取TOPN視窗函式

hive,spark獲取TOPN視窗函式

TOPNrow number說明: row_number() over ([partition col1] [order by col2]) rank() over ([partition col1] [order by col2]) dense_rank() over ([partition col1] [order by col2]) 它們都是根據col1欄位分組,然後對col2欄位進行排序,對排序後的每行生成一個行號,這個行號從1開始遞增 col1、col2都可以是多個欄位,用‘,‘分隔區別: 1)row_number:不管col2欄位的值是否相等,行號一直遞增,比如:有兩條記錄的值相等,但一個是第一,一個是第二 
2)rank:上下兩條記錄的col2相等時,記錄的行號是一樣的,但下一個col2值的行號遞增N(N是重複的次數),比如:有兩條並列第一,下一個是第三,沒有第二 3)dense_rank:上下兩條記錄的col2相等時,下一個col2值的行號遞增1,比如:有兩條並列第一,下一個是第二以spark整合hive為例:hiveContext.sql("select *,row_number() over(partition by areaName order by clickNum desc) rnb from spark_area_data").registerTempTable("spark_row_number")hiveContext.sql("select * from spark_row_number where rnb<=3 order by areaLevelName asc,areaName desc").show(100)
  • 1
//測試原資料 spark_area_data(部分資料)|areaLevelName|areaName|productName|clickNum|extendInfo|+-------------+--------+-----------+--------+----------+| A| 東北地區| 奶粉| 153| 第三方|| B| 華東地區| 果酒| 387| 自營|| C| 西南地區| 米酒| 277| 自營|
| C| 華南地區| 啤酒| 144| 第三方|| B| 華東地區| 茶葉| 374| 第三方|| C| 華南地區| 洋酒| 113| 自營|| B| 華東地區| 巧克力| 317| 自營|| B| 華東地區| 白酒| 313| 自營|| C| 華南地區| 奶粉| 145| 第三方|| B| 華中地區| 咖啡| 135| 第三方|| A| 華北地區| 果酒| 241| 自營|| C| 西南地區| 麵包| 186| 第三方|| C| 西南地區| 巧克力| 261| 自營|| C| 西南地區| 白酒| 244| 自營|//結果|areaLevelName|areaName|productName|clickNum|extendInfo|rnb|+-------------+--------+-----------+--------+----------+---+| A| 華北地區| 啤酒| 277| 第三方| 1|| A| 華北地區| 麵包| 275| 第三方| 2|| A| 華北地區| 巧克力| 260| 自營| 3|| A| 東北地區| 咖啡| 171| 第三方| 1|| A| 東北地區| 啤酒| 171| 第三方| 2|| A| 東北地區| 茶葉| 157| 第三方| 3|| B| 華中地區| 奶粉| 168| 第三方| 1|| B| 華中地區| 洋酒| 164| 自營| 2|| B| 華中地區| 白酒| 160| 自營| 3|| B| 華東地區| 果酒| 387| 自營| 1|| B| 華東地區| 洋酒| 383| 自營| 2|