Hadoop 查找两列中的前3列是否匹配
这是我的表1中的以下数据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
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