0

我有一个搜索日志,其中包含时间、地点和查询等字段。我想从特定时间之间的特定地点找到查询次数最多的单词。所有字段,即日期、时间、query_String 都是字符数组。我有以下猪脚本,但它没有执行所需的操作。

Data = LOAD 'data' USING CustomPigStorage();
FClients = FILTER Data BY NOT(country is null);
Clients = FOREACH FClients GENERATE date,time, country,query_string as query;
grp = group Clients by (query, country, date, time);
wth_count = foreach grp generate FLATTEN(group), COUNT(Clients) as count;

例如,我希望结果是“下午 2 点到 3 点之间,你好在美国被搜索了 4 次”。我基本上对 Count() 函数感到困惑。对猪来说相对较新。我相信我的 count() 在这里计算我拥有的记录总数。

4

1 回答 1

0

您的查询看起来正确,COUNT(Clients) 返回包中的记录数,这些记录来自 Clients 并且属于该组。要查看它,您可以从“wth_count”语句中删除 COUNT 并将结果保存到文件中然后查看它。

wth_count = foreach grp generate group, Clients;
store wth_count into 'path';

您的潜在问题可能在于您在 group by 中使用日期和时间列,并且它们产生了太多组。为了缓解这种情况,您可以编写一个 java 静态函数来获取日期和时间并返回该范围的单个值,例如 12-07-2012、14.05.03 转换为“12-07-2012 14h”和 12-07 -2012, 14.05.05 变为“12-07-2012 14h”。这将创建一个涵盖时间间隔 2pm 和 3pm 的密钥,并将 Clinets 中的所有记录放入该组的包中。

于 2012-07-14T14:42:42.223 回答