pig如何计算alias中的行数

f0ofjuux  于 2021-06-21  发布在  Pig
关注(0)|答案(7)|浏览(304)

我这样做是为了计算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;

这似乎效率太低了。如果有更好的方法请指点我!

qq24tv8q

qq24tv8q1#

计数是清管器的一部分参见手册

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

fdbelqdn2#

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

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');
qrjkbowd

qrjkbowd3#

ArnonRotemGalOz不久前已经回答了这个问题,但我想有些人可能会喜欢这个稍微简洁一点的版本。

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

yacmzcpb4#

基本计数如其他答案和清管器文件中所述:

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

你是对的,计数是低效的,即使使用Pig的内置计数,因为这将使用一个减速机。然而,我今天发现了一个加速的方法之一是减少我们正在计算的关系的ram利用率。
换句话说,当计算一个关系时,我们实际上并不关心数据本身,所以让我们使用尽可能少的ram。您的count脚本的第一次迭代是正确的。

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

这将在比上一个脚本更大的关系上工作,并且应该更快。这个脚本和您的原始脚本之间的主要区别是我们不需要求和。
这与其他解决方案没有相同的问题,因为空值会影响计数。这将统计所有行,不管第一列是否为null。

tvokkenx

tvokkenx5#

您需要的是计算关系中的所有行(pig拉丁语中的数据集)
接下来的步骤非常简单:

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,我们只有第一个字段不为空的行数。
我也喜欢jerome的单行语法,它更简洁,但为了说教,我更喜欢把它一分为二,并添加一些评论。
一般来说,我更喜欢:

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

结束

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

cczfrluj6#

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

bxfogqkk

bxfogqkk7#

使用计数星

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

相关问题