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

kee*_*kee 50 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;
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*-Oz 94

COUNT是猪的一部分,请参阅手册

LOGS= LOAD 'log';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT(LOGS);
Run Code Online (Sandbox Code Playgroud)

  • 是否可以在没有首先分组的情况下计算别名中的行数? (2认同)
  • 同样的问题.我读到"GROUP x ALL"将强制管道中的序列化,从而导致可能的减速.那是对的吗? (2认同)

Jer*_*ano 30

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

LOGS = LOAD 'log';
LOG_COUNT = FOREACH (GROUP LOGS ALL) GENERATE COUNT(LOGS);
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 29

小心,COUNT包中的第一个项目不能为空.否则,您可以使用该函数COUNT_STAR计算所有行.


Wat*_*Box 5

如其他答案和猪文档中所述,完成了基本计数:

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
Run Code Online (Sandbox Code Playgroud)

没错,即使使用Pig的内置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
Run Code Online (Sandbox Code Playgroud)

这将比以前的脚本处理更大的关系,并且应该更快。此脚本与您的原始脚本之间的主要区别在于,我们无需对任何内容进行求和。


hel*_*hek 5

使用 COUNT_STAR

LOGS= LOAD 'log';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT_STAR(LOGS);
Run Code Online (Sandbox Code Playgroud)