Hadoop 查找两列中的前3列是否匹配

Hadoop 查找两列中的前3列是否匹配,hadoop,mapreduce,hive,hiveql,Hadoop,Mapreduce,Hive,Hiveql,这是我的表1中的以下数据 BID PID TIME ---------+-------------------+---------------------- 1345653 330760137950 2012-07-09 21:42:29 1345653 330760137950 2012-07-09 21:43:29 1345653 330760137950

这是我的表1中的以下数据

BID           PID                       TIME
---------+-------------------+----------------------
1345653       330760137950       2012-07-09 21:42:29
1345653       330760137950       2012-07-09 21:43:29
1345653       330760137950       2012-07-09 21:40:29
1345653       330760137950       2012-07-09 21:41:29
1345653       110909316904       2012-07-09 21:29:06
1345653       221065796761       2012-07-09 19:31:48
因此,如果我需要澄清上述情况,我在上表中有这样的数据- 对于用户1345653,我将此PID 330760137950设置了四次,但时间戳不同。所以我需要这样的输出-

我需要的输出:-

1345653       330760137950       2012-07-09 21:43:29
1345653       330760137950       2012-07-09 21:42:29
1345653       330760137950       2012-07-09 21:41:29
1345653       110909316904       2012-07-09 21:29:06
1345653       221065796761       2012-07-09 19:31:48
所以基本上,如果BID和PID是相同的,但有不同的时间戳,那么我需要按时间降序排列的前3个

为此,我在配置单元中创建了rank UDF用户定义函数。我写了下面的查询,但它对我不起作用。有人能帮我吗

SELECT bid, pid, rank(bid), time, UNIX_TIMESTAMP(time)
FROM (
    SELECT bid, pid, time
    FROM table1
    where to_date(from_unixtime(cast(UNIX_TIMESTAMP(time) as int))) = '2012-07-09'
    DISTRIBUTE BY bid,pid
    SORT BY bid, time desc
) a
WHERE rank(bid) < 3;
这是错误的,因为我缺少上面预期输出的最后两行。有人能帮我吗

select bid, pid, [time] from (
    select bid, pid, [time], rank() over (partition by bid, pid order by [time] desc) as k 
    from #temp ) as x 
where k  <=3
order by bid, pid, time desc 
哦,我在sql server。我不认为你是

无论如何。我的建议是将rank函数移动到嵌套select中。在外面选择你想要的地方,它是少于三。。。我不知道你的语法。我不该回答这个问题。很抱歉哈哈

在这里:
你的排名在外选。。。它需要在里面。离开<4或者是的。我在蜂房里工作。我通过修改您的选择买方id、项目id、从选择买方id创建的时间、项目id、创建的时间、按买方id划分的排名、项目id订单按创建的时间描述作为k从测试表1作为x,其中k编号。。。。我不知道。您的代码在sql server中运行。它可能不喜欢将嵌套的select作为唯一的from表。。。。。您可能需要将嵌套的select粘贴到临时表中,然后从临时表中选择*from,其中k或hive没有列组。。。很抱歉但我已经在Hive中创建了一个用户定义函数rank。我实际上正在编写相同的教程,但仍然存在相同的问题。仍然没有得到确切的输出。
select bid, pid, [time] from (
    select bid, pid, [time], rank() over (partition by bid, pid order by [time] desc) as k 
    from #temp ) as x 
where k  <=3
order by bid, pid, time desc 
SELECT bid, pid, time
FROM (
    SELECT bid, pid, rank(time) as rank, time
    FROM $compTable 
    DISTRIBUTE BY bid, pid
    SORT BY bid, pid, time desc
) a
WHERE rank < 4
ORDER BY bid, pid, time desc