如何在mapreduce中实现SQL的排名功能?

时间:2013-07-08 05:24:43

标签: mapreduce hive rank

我有一种情况需要在mapreduce中复制SQL排名函数。 它类似于:QUALIFY Row_number()over(按a.column1分区顺序a.column2 desc,d.column3 desc)= 1

谢谢。

3 个答案:

答案 0 :(得分:0)

  

它类似于:QUALIFY Row_number()over(partition by   a.column1由a.column2 desc命令,d.column3 desc)= 1

对不起,我不太明白。你是想通过蜂巢还是MR来实现这个目的?你的问题是你通过MR需要它,但是你已经显示了这个查询。两者完全不同。

如果您想通过Hive实现此目的,您可能会发现此post非常有用。如果你想要这种MR方式,你需要从头开始编写代码。

HTH

答案 1 :(得分:0)

以下是使用普通查询复制Rank函数。

无论数据库如何,此查询都将执行。要求是根据文件名中的日期对文件名进行排名。

**Sample Records**:
`insert into ref values('840001','840001_2015_04_29');
insert into ref values('840002','840002_2015_04_29');
insert into ref values('840003','840003_2015_04_29');
insert into ref values('840004','840004_2015_04_29');
insert into ref values('840008','840008_2015_04_28');
insert into ref values('840009','840009_2015_05_02');
insert into ref values('850005','850010_2015_05_29');
insert into ref values('850005','850010_2015_05_23');
insert into ref values('850005','850010_2015_05_12');
insert into ref values('850005','850010_2015_05_17');
insert into ref values('850006','850010_2015_05_29');
insert into ref values('850006','850010_2015_05_23');
insert into ref values('850006','850010_2015_05_16');`

`**Table Structure**:
CREATE TABLE ref
(
     ffid   TEXT
    ,filename       TEXT
);`

**Query**:
SELECT 
   S1.FFID
  ,S1.FILENAME
  ,(
    SELECT COUNT(*) + 1
    FROM 
    (SELECT DISTINCT FFID,FILENAME FROM REF) AS S2 
    WHERE S1.FFID=S2.FFID AND S1.FILENAME < S2.FILENAME
   ) AS RANK 
 FROM 
  (SELECT DISTINCT FFID,FILENAME FROM REF) AS S1
 WHERE RANK=1
 ORDER BY FFID ;

答案 2 :(得分:0)

排名很高:

rank() over (partition by a.column1 order by a.column2 desc, d.column3 desc)

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics