我有一个问题,我不确定如何在 Pig 中解决。我在 Hadoop 上有一个数据集(大约 400 万条记录),其中包含按产品类别划分的产品标题。每个标题都有编号。它出现在网页上的次数,没有。点击它进入产品详细信息页面的次数。没有。产品类别中的标题可能会有所不同。
样本数据 -
电子游戏|光环 4|5400|25
电子游戏|极限竞速 4 限量珍藏版|6000|10
电子游戏|漫威终极联盟|2000|55
相机和照片|适用于 GoPro HD 的专业斯坦尼康|12000|250
相机和照片|英雄GoPro Motorsports 1080P 宽高清 5MP 头盔摄像机|10000|125
我想根据第三列(网页上的外观)获取每个产品类别中前 N% 的记录。但是,N % 必须根据类别的权重/重要性而有所不同。例如。对于电子游戏,我想获得前 15% 的记录;对于相机和照片,我想获得前 5% 等。有没有办法在 Pig 的嵌套 FOREACH 代码块内的 LIMIT 子句中动态设置 % 或整数值?
PRODUCT_DATA = LOAD '<PRODUCT FILE PATH>' USING PigStorage('|') AS (categ_name:chararray, product_titl:chararray, impression_cnt:long, click_through_cnt:long);
GRP_PROD_DATA = GROUP PRODUCT_DATA BY categ_name;
TOP_PROD_LIST = FOREACH GRP_PROD_DATA {
SORTED_TOP_PROD = ORDER PRODUCT_DATA BY impression_cnt DESC;
SAMPLED_DATA = LIMIT SORTED_TOP_PROD <CATEGORY % OR INTEGER VALUE>;
GENERATE flatten(SAMPLED_DATA);
}
STORE TOP_PROD_TITLE_LIST INTO '<SOME PATH>' USING PigStorage('|');
如何动态(按类别)设置给定组的 % 或整数值?我想过使用宏,但不能从嵌套的 FOREACH 块中调用宏。我可以编写一个将类别名称作为参数的 UDF,并输出 % OR INTEGER 值,并从 LIMIT 操作中调用此 UDF 吗?
SAMPLED_DATA = LIMIT SORTED_TOP_PROD categLimitVal(categ_name);
有什么建议么?我正在使用 Pig 的 0.10 版。