1

我正在运行一个 PIG 脚本,一切都进行得非常快,直到我上FOREACH ... GENERATE FLATTEN(...)线为止。

有没有理由让这条线跑得这么慢。(它会导致整个脚本在相当强大的集群上超时)

extended = FOREACH kRecords GENERATE *, NORMALIZE(query) AS query_norm:chararray;
-- DESCRIBE extended;
-- extended: {query: chararray,url: chararray,query_norm: chararray}

-- GROUP by both query and url
grouped = GROUP extended BY (query_norm, url);
-- DESCRIBE grouped;
-- grouped: {group: (query_norm: chararray,url: chararray),extended: {(query: chararray,url: chararray,query_norm: chararray)}}

-- Remove multiple items per record (but at the expense of duplicating records)
-- THE LINE BELOW IS THE SLOW ONE!!!
flattened = FOREACH grouped GENERATE FLATTEN(extended.query_norm), FLATTEN(extended.url);
-- THE LINE ABOVE IS THE SLOW ONE!!!

-- Remove duplicates
result = DISTINCT flattened;

谢谢,巴里

4

1 回答 1

2

在 GENERATE 之后一起使用 2 个 FLATTEN(...) 运算符时,您会在 2 个袋子之间获得笛卡尔积。因此,如果 GROUP 生成的包有 N 个元素,在同一个包上的 2 个 FLATTEN(..) 运算符之后,您将获得每个组生成的 N*N 行,这可能会对 CPU、HDD 和网络造成沉重负担。请参见以下示例:

代码:

inpt = load '/pig_fun/input/group.txt' as (c1, c2);
grp = group inpt by (c1, c2);
flt = foreach grp generate FLATTEN(inpt.c1), FLATTEN(inpt.c2);

输入:

1       a
1       a
1       b
1       b
1       c

输出:

(1,a)
(1,a)
(1,a)
(1,a)
(1,b)
(1,b)
(1,b)
(1,b)
(1,c)

看看 (1,a) 的 2 条记录和 (1,b) 的 2 条记录如何分别导致 4 条输出记录。但是 (1,c) 的 1 条记录仅导致 1 条输出记录。

于 2012-06-28T08:35:26.943 回答