我这样做是为了计算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;
这似乎效率太低了。如果有更好的方法请指点我!
我这样做是为了计算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条答案
按热度按时间qq24tv8q1#
计数是清管器的一部分参见手册
fdbelqdn2#
这是一个优化版本。上面的所有解决方案都需要pig在计数时读写完整的元组,下面的脚本只需写“1”
我喜欢用它
qrjkbowd3#
ArnonRotemGalOz不久前已经回答了这个问题,但我想有些人可能会喜欢这个稍微简洁一点的版本。
yacmzcpb4#
基本计数如其他答案和清管器文件中所述:
你是对的,计数是低效的,即使使用Pig的内置计数,因为这将使用一个减速机。然而,我今天发现了一个加速的方法之一是减少我们正在计算的关系的ram利用率。
换句话说,当计算一个关系时,我们实际上并不关心数据本身,所以让我们使用尽可能少的ram。您的count脚本的第一次迭代是正确的。
这将在比上一个脚本更大的关系上工作,并且应该更快。这个脚本和您的原始脚本之间的主要区别是我们不需要求和。
这与其他解决方案没有相同的问题,因为空值会影响计数。这将统计所有行,不管第一列是否为null。
tvokkenx5#
您需要的是计算关系中的所有行(pig拉丁语中的数据集)
接下来的步骤非常简单:
我不得不说凯文的观点很重要,因为用count代替count,我们只有第一个字段不为空的行数。
我也喜欢jerome的单行语法,它更简洁,但为了说教,我更喜欢把它一分为二,并添加一些评论。
一般来说,我更喜欢:
结束
cczfrluj6#
小心,小心
COUNT
包中的第一项不能为空。否则你可以使用这个函数COUNT_STAR
计算所有行数。bxfogqkk7#
使用计数星