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; 

这似乎太低效了。 请赐教,如果有更好的办法!

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

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

请注意, COUNT中包内的第一件商品不能为空。 否则,您可以使用函数COUNT_STAR来计算所有行。

不久前,Arnon Rotem-Gal-Oz已经回答了这个问题,但是我想有些人可能会喜欢这个稍微简洁的版本。

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

基本计数按照其他答案和猪的文件中所述的方式完成:

 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 

你说得对,效率低下,即使使用猪的内置计数,因为这将使用一个还原剂。 不过,今天我有一个启示,加速它的方法之一是减less我们正在计算的关系的RAM利用率。

换句话说,在计算一个关系的时候,我们实际上并不关心数据本身,所以我们尽可能less地使用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 

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

使用COUNT_STAR

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

这里是一个优化的版本。 上面的所有解决scheme都要求猪在计数时读写完整的元组,下面这个脚本只是写'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'); 

你想要的是统计关系中的所有行(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);