我有一个Pig脚本,花了大约10分钟完成,我认为仍然有一些性能改进的空间。
所以,我先把 JOIN
s和 GROUP
在嵌套的 FOREACH
并且把前面的 FILTER
在同一个房间里 FOREACH
.
我还补充道 using 'replicated'
.
现在的问题是,不是花10分钟,而是花了30多分钟。
除了pig的文档外,有没有一个地方有最佳实践和性能改进技巧?
为了更好地了解情况,这里有一些代码:
--before
previous_join = JOIN A by id, B by id --for symplification
filtering = FILTER previous_join BY ((year_min > 1995 ? year_min - 1 : year_min) <= list_year and (year_max > 2015 ? year_max - 1 : year_max) >= list_year);
final_filtered = FOREACH filtering GENERATE user_id as user_id, list_year;
--after
final_filtered = FOREACH (JOIN A by id, B by id) {
tmp = FILTER group BY ((A::year_min > 1995 ? A::year_min - 1 : A::year_min) <= B::list_year and (A::year_max > 2015 ? A::year_max - 1 : A::year_max) >= B::list_year and A::premium == 'true');
GENERATE A::user_id AS user_id, B::list_year AS list_year;
};
是我做错了什么还是这是一个错误的方法?
谢谢。
1条答案
按热度按时间mklgxw1f1#
在前一种情况下,[之前]在执行联接之后执行过滤和投影。如果您计算每个操作的时间日志并确定瓶颈操作,这将很有帮助。
您是否也可以尝试将筛选语句拆分为多个关系而不是一个关系,并检查筛选计时的差异?
总的来说,如果要查找a::year\u min<=b::list\u year和a::year\u max>=b::list\u year的ID(+更多的列),而不是对原始a&b执行联接,可以尝试在这两个ID上使用投影,以便只包含联接和以后操作所需的列。
如果a-projected或b-projected中的任何一个都是一个可以使用复制联接加载到内存中的小集合,那么我假设b-projected是一个比a-projected更小的集合。如果这不适用于您的情况,请跳过此选项。
您还可以尝试使用parallel关键字来设置要用于此联接的减速器的数量。
应用过滤器后,您将获得所需id的列表,您可以使用该列表从a或b获取其他信息。
还可以考虑调整mapreduce属性,如io.sort.mb、mapred.job.shuffle.input.buffer.percent等。
希望这有帮助。