1. 程式人生 > >hive資料去重,並取指定的一條資料

hive資料去重,並取指定的一條資料

hive資料去重,並根據需求取其中一條

資料案例:

name  adx       tran_id                 cost        ts
ck        5        125.168.10.0          33.00   1407234660

ck        5        187.18.99.00          33.32   1407234661

ck        5        125.168.10.0          33.24   1407234661 


需要前兩行的記錄因為第三行的tran_id和第一行的重複了,所以需要將最後面一行重復的去掉

方案一:

selectt1.tran_id,t2.name,t2.cost

from (selectdistinct tran_id from table) t1

join table t2 ont1.tran_id=t2.tran_id

分析如果使用distinct的話,需要tran_id放在第一列,查出來的資料很不友好。

方案二:

select*

 from(

        select *,row_number() over (partitionby tran_idorder by timestamp asc) num from table

  ) t

wheret.num=1; 

分析:

row_number()over (partition by tran_idorder by timestamp desc) num   num=1 意思是先根據tran_id進行分組,並在分組內部timestamp 降序排序row_number()函式計算的值就表示某個tran_id組內部排序後的順序編號(該編號在一個組內連續並且唯一的所以最後直接去每個分組內的第一個(num=1)即可。

PS

ROW_NUMBER() OVER函式的基本用法語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)簡單的說

row_number()1開始,為每一分組記錄返回一個數字,這裡的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再為降序以後的每條xlh記錄返回一個序號。示例:
xlh          row_num 

1700             1
1500             2 

1085             3

710               4


row_number() OVER (PARTITION BY 
COL1 ORDERBY COL2) 表示根據COL1分組,在分組內部根據COL2排序,而此函式計算的值就表示每組內部排序後的順序編號(該編號在組內連續並且唯一的

例項:

資料顯示為
empid       deptid     salary

----------- --------------------------------------------------
1          10          5500.00
2          10          4500.00
3           20         1900.00
4          20          4800.00
5          40          6500.00
6          40          14500.00
7          40          44500.00
8          50          6500.00
9          50          7500.00 
需求:根據部門分組,顯示每個部門的工資等級預期結果:
empid       deptid     salary                                rank

----------- -------------------------------------------------- --------------------
1          10          5500.00                               1
2          10          4500.00                               2
4          20          4800.00                               1
3          20          1900.00                               2
7          40          44500.00                             1
6          40          14500.00                             2
5          40          6500.00                               3
9          50          7500.00                               1
8          50          6500.00                               2 
SQL指令碼:
SELECT *, Row_Number() OVER (partition by deptidORDER BY salary desc) rank FROM employee