如何将单元格拆分成单独的行并找到最小汇总值

How to split cell into sepatare rows and find minial summary value

我有以下数据集:

Movies : moviename, genre1, genre2, genre3 ..... genre19  

(以上所有类型的值为0或1,1表示电影属于该类型)
现在我想找出哪部电影类型最少?

我尝试了下面的 Pig 脚本:

items = load 'path' using PigStorage('|') as (mName:chararray,g1:int,g2:int,g3:int,g4:int,g5:int,g6:int,g7:int,g8:int,g9:int,g10:int,g11:int,g12:int,g13:int,g14:int,g15:int,g16:int,g17:int,g18:int,g19:int);

sumGenre = foreach items generate mName, g1+g2+g3+g4+g5+g6+g7+g8+g9+g10+g11+g12+g13+g14+g15+g16+g17+g18+g19 as sumOfGenres;

groupAll = group sumGenre All;

在下一步中,通过使用 MIN(sumGenre.sumofGenres),我可以获得一个类型,它是 MIN 值,但我正在寻找的是获得一个最少没有的电影名称。类型,以及该电影的类型数量。

有人可以帮忙吗?
1.我想知道有没有其他简单的方法可以得到g1+g2+...g19的总和?
2. 还有输出:流派最少的电影?

之后groupAll

r1 = minGenre = foreach groupAll generate MIN(sumGenre.sumOfGenres) as minG;

minG r1sumOfGenres sumGenre 之间的左外连接;

获取流派最少的电影列表..

希望这会有所帮助..

对于动态行字段总和,您可以像这样使用 UDF..

public class DynRowSum  extends EvalFunc<Integer> 
{
public Integer  exec(Tuple v) throws IOException
{
List<Object>  olist  =  v.getAll();
int sum = 0;
int cnt=0;
for( Object o : olist){
   cnt++;
   if (cnt!=1) {
                int val= (Integer)o;
                sum = sum + val;
   }
}
return new Integer(sum);
}

} 

在 pig 中像这样更新脚本..

grunt>sumGenre = foreach items generate mName,DynRowSum(*) as sumOfGenres;

如果类型增加或减少代码保持不变,您将在这里获得优势..

a = LOAD 'path';
b = FOREACH a generate FLATTEN(STRSPLIT([=10=], '\|'));
c = FOREACH b generate [=10=] as movie, FLATTEN(TOBAG(*)) as genre;
d = FILTER c BY movie!=genre;
e = GROUP d BY [=10=];
f = FOREACH e GENERATE group, SUM(d);
i = ORDER f BY ;
j = LIMIT i 1;