3

我有以下输入,其中用户以以下百分比(25 或 50 或 75 或 100)观看节目。我只想计算某个用户在某个 id 上观看的最高百分比。输入和输出如下所示。

输入

id1, u1, watched25
id2, u1, watched25
id1, u1, watched50
id1, u1, watched75
id3, u1, watched25
id4, u1, watched25
id1, u1, watched100
id2, u1, watched50
id5, u1, watched25
id5, u1, watched50
id5, u1, watched75
id5, u1, watched100
id1, u2, watched25
id1, u2, watched50
id3, u2, watched25
id3, u3, watched25
id1, u2, watched75
id4, u3, watched25
id4, u3, watched50

期望的输出

id1, u1, watched100
id2, u1, watched50
id3, u1, watched25
id5, u1, watched25
id5, u1, watched100
id1, u2, watched75
id3, u2, watched25
id3, u3, watched25
id4, u3, watched50
4

2 回答 2

1

我认为以下内容可以满足您的要求。

select id, u, max(cast(substr(w, 9) as int)) 
from my_table 
group by id, u 
order by u, id

这里结合了一些东西。让我解开重要的部分。

首先,我使用(从第八个字母开始的子字符串)丢弃"watched"第三列的部分,然后我将此值转换为一个数字,最后我使用并仅保留每个元组的最大值。我添加了该子句以匹配所需输出示例的排序。substr(w, 8)cast(X as int)group bymax()id, uorder by

在您的输入上运行它会产生以下输出。

id1  u1 100
id2  u1 50
id3  u1 25
id4  u1 25
id5  u1 100
id1  u2 75
id3  u2 25
id3  u3 25
id4  u3 50

希望有帮助。

于 2013-06-20T09:39:01.387 回答
0

您可以使用 pig 来实现这一点(假设百分比是数字)

a = LOAD 'input' as (id:chararray, user:chararray, percentage:int);
b = group a by (id, user);
c = foreach b generate group.id, group.user, MAX(a.percentage) as highest;

STORE c into 'output';
于 2013-06-19T14:43:35.273 回答