0

这是我的 Table1 中的以下数据

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 four times,但时间戳不同。所以我需要这样的输出 -

我需要的输出:-

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

所以基本上如果BIDPID相同但不同timestamps,那么我需要按时间降序排序的前 3 名

为此,我rank UDF在 Hive 中创建了(用户定义的函数)。我写了下面的查询,但它对我不起作用。谁可以帮我这个事?

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;

所以通过上面的查询,我得到这样的输出

1345653       330760137950       2012-07-09 21:43:29
1345653       330760137950       2012-07-09 21:42:29
1345653       330760137950       2012-07-09 21:41:29

这是错误的,因为我缺少Expected Output上面的最后两行。谁能帮我这个?

4

1 回答 1

1
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 中。我不认为你是......

反正。我的建议是您将排名函数移动到您拥有的嵌套选择中。在外部选择你想要它小于三个的地方......我不知道你的语法。我不应该回答这个问题。对不起....大声笑

在这里: http ://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoopive/ 你的 rank() 在外部选择中......它需要在内心。不过,请在外部 where 语句中保留 < 4 或 <= 3 或其他任何内容。您的查询几乎看起来与该示例完全一样......只需要进行一些更改。

基于链接和我对 Hive 的绝对缺乏知识......我想你可能想要这个:

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

而且我无法测试或编译,因为老实说,在您发布问题之前我不知道蜂巢是什么。(小世界,我知道,如此悲伤——如此真实)

于 2012-07-19T21:27:31.417 回答