PIG如何计算别名中的多个行

时间:2012-03-28 03:29:17

标签: hadoop apache-pig

我做了类似的事情来计算PIG中别名的行数:

logs = LOAD 'log'
logs_w_one = foreach logs generate 1 as one;
logs_group = group logs_w_one all;
logs_count = foreach logs_group generate SUM(logs_w_one.one);
dump logs_count;

这似乎效率太低。如果有更好的方法请赐教!

7 个答案:

答案 0 :(得分:94)

COUNT是猪see the manual

的一部分
LOGS= LOAD 'log';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT(LOGS);

答案 1 :(得分:29)

小心,COUNT你的第一件物品不能为空。否则,您可以使用函数COUNT_STAR来计算所有行。

答案 2 :(得分:29)

Arnon Rotem-Gal-Oz刚刚回答了这个问题,但我觉得有些人可能会喜欢这个稍微简洁的版本。

LOGS = LOAD 'log';
LOG_COUNT = FOREACH (GROUP LOGS ALL) GENERATE COUNT(LOGS);

答案 3 :(得分:4)

基本计数按照其他答案和猪文件中的说明完成:

logs = LOAD 'log';
all_logs_in_a_bag = GROUP logs ALL;
log_count = FOREACH all_logs_in_a_bag GENERATE COUNT(logs);
dump log_count

你是对的,即使使用猪的内置COUNT计数也是低效的,因为这将使用一个减速器。但是,我今天有一个启示,加速它的方法之一就是减少我们计算的关系的RAM利用率。

换句话说,在计算关系时,我们实际上并不关心数据本身,所以让我们使用尽可能少的RAM。第一次计算脚本迭代,你就在正确的轨道上。

logs = LOAD 'log'
ones = FOREACH logs GENERATE 1 AS one:int;
counter_group = GROUP ones ALL;
log_count = FOREACH counter_group GENERATE COUNT(ones);
dump log_count

这将比以前的脚本更大的关系工作,应该更快。这和你原来的脚本之间的主要区别在于我们不需要总结任何东西。

答案 4 :(得分:2)

USE COUNT_STAR

LOGS= LOAD 'log';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT_STAR(LOGS);

答案 5 :(得分:0)

这是一个优化版本。 上面的所有解决方案都需要猪在计数时读写完整的元组,下面这个脚本只写'1'-s

DEFINE row_count(inBag, name) RETURNS result {
    X = FOREACH $inBag generate 1;
    $result = FOREACH (GROUP X ALL PARALLEL 1) GENERATE '$name', COUNT(X);
};

使用它

xxx = row_count(rows, 'rows_count');

答案 6 :(得分:0)

你想要的是计算关系中的所有行(Pig Latin中的数据集)

接下来的步骤非常容易:

logs = LOAD 'log'; --relation called logs, using PigStorage with tab as field delimiter
logs_grouped = GROUP logs ALL;--gives a relation with one row with logs as a bag
number = FOREACH LOGS_GROUP GENERATE COUNT_STAR(logs);--show me the number

我必须说凯文的重点是使用COUNT而不是COUNT_STAR,我们只有第一个字段不为空的行数。

我也喜欢杰罗姆的单行语法,它更简洁,但为了说教,我更喜欢将它分成两部分并添加一些注释。

一般来说,我更喜欢:

numerito = FOREACH (GROUP CARGADOS3 ALL) GENERATE COUNT_STAR(CARGADOS3);

name = GROUP CARGADOS3 ALL
number = FOREACH name GENERATE COUNT_STAR(CARGADOS3);