簡體   English   中英

使用 row_number() 的 hadoop hive

[英]hadoop hive using row_number()

我有一個包含許多重復 ID 的數據集。 我只想做一個 row_number() 並取第一個。 如果我將 table1 與 table2 左連接並且只使用 table2.rownumber=1,它就可以工作。 但如果我在沒有表連接的情況下進行獨立操作,則不會。 我有以下代碼:

SELECT ID, NAME, NRIC, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as RNK FROM TABLE1 WHERE RNK=1;

錯誤消息顯示 RNK 不是有效的表列或別名等。

任何幫助將不勝感激。 謝謝。

您必須使用子查詢或 CTE 來引用列別名以進行過濾:

SELECT ID, NAME, NRIC, RNK
FROM (SELECT t1.*, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as RNK
      FROM TABLE1
     ) t1
WHERE RNK = 1;

即使由窗口函數定義,所有列別名也是如此。

鑒於:

create table dupes (
id string,
democode string,
extract_timestamp string
);

和:

insert into dupes (id, democode,extract_timestamp) values 
('1','code','2020')
,('2','code2','2020')
,('2','code22','2021')
,('3','code3','2020')
,('3','code33','2021')
,('3','code333','2012')
;

什么時候:

SELECT id,democode,extract_timestamp
FROM (
  SELECT id,democode,extract_timestamp, 
  ROW_NUMBER() OVER (PARTITION BY id ORDER BY extract_timestamp DESC) AS row_num
  FROM dupes 
) t1
WHERE row_num = 1;

然后:

+-----+-----------+--------------------+--+
| id  | democode  | extract_timestamp  |
+-----+-----------+--------------------+--+
| 1   | code      | 2020               |
| 2   | code22    | 2021               |
| 3   | code33    | 2021               |
+-----+-----------+--------------------+--+

請注意,表通常是分區的,我們可能希望在每個分區內進行重復數據刪除。 在這種情況下,我們會將分區鍵添加到OVER語句中。 例如,如果表是按report_date DATE分區的,那么我們可以使用:

ROW_NUMBER() OVER (PARTITION BY id, report_date ORDER BY extract_timestamp DESC) AS row_num

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM