Apache pig Pig中布尔到整数的转换

Apache pig Pig中布尔到整数的转换,apache-pig,Apache Pig,我有一个如下所示的数据集: foo,R foo,Y bar,C foo,R baz,Y foo,R baz,Y baz,R ... 富,R 富,Y 巴,C 富,R 巴兹,Y 富,R 巴兹,Y 巴兹,R ... 我想生成一个报告,总结第一列中每个唯一值的“R”、“Y”和“C”记录数。对于此数据集,它看起来像: foo,3,1,0 bar,0,0,1 baz,1,2,0 傅,3,1,0 巴,0,0,1 baz,1,2,0 其中第二列是“R”记录的数量,第三列是“Y”记录的数量,最后一列是“C”记录的

我有一个如下所示的数据集:

foo,R foo,Y bar,C foo,R baz,Y foo,R baz,Y baz,R ... 富,R 富,Y 巴,C 富,R 巴兹,Y 富,R 巴兹,Y 巴兹,R ... 我想生成一个报告,总结第一列中每个唯一值的“R”、“Y”和“C”记录数。对于此数据集,它看起来像:

foo,3,1,0 bar,0,0,1 baz,1,2,0 傅,3,1,0 巴,0,0,1 baz,1,2,0 其中第二列是“R”记录的数量,第三列是“Y”记录的数量,最后一列是“C”记录的数量

我知道我可以先按记录类型、组和聚合进行筛选,但这会导致三个子报告的昂贵合并。我宁愿分组一次,并在我的组中生成每个{R,Y,C}列


如何将数据集中第二列与“R”、“Y”或“C”进行比较的布尔结果转换为可以聚合的数值?理想情况下,对于三列中的每一列,我希望1表示匹配,0表示不匹配。

Apache PIG非常适合此类问题。它可以通过一个分组和一个嵌套FOREACH来解决

inpt = load '~/pig/data/group_pivot.csv' using PigStorage(',') as (val : chararray, cat : chararray);
grp = group inpt by (val);
final = foreach grp {
    rBag = filter inpt by cat == 'R';
    yBag = filter inpt by cat == 'Y';
    cBag = filter inpt by cat == 'C';
    generate flatten(group) as val, SIZE(rBag) as R, SIZE(yBag) as Y, SIZE(cBag) as C;
};

dump final;
--(bar,0,0,1)
--(baz,1,2,0)
--(foo,3,1,0)

bool = foreach final generate val, (R == 0 ? 0 : 1) as R, (Y == 0 ? 0 : 1) as Y, (C == 0 ? 0 : 1) as C;

dump bool;
--(bar,0,0,1)
--(baz,1,1,0)
--(foo,1,1,0)
我在你的例子上试过了,得到了预期的结果。其思想是,按每个值分组后,将有一个包,其中包含R、Y、C类别的所有行。使用FOREACH中的过滤器,我们创建了3个单独的袋子(每个R、Y、C各一个)和大小(袋子),以生成每个袋子中的行数

您可能遇到的唯一问题是,val列中有太多具有相同值的行,因为嵌套FOREACH依赖于内存中的操作,因此产生的中间包可能会变得相当大。如果您开始出现与内存相关的异常,那么您可以从中得到启发。其想法是使用2个GROUP BY操作,第一个用于获取每个(val,cat)的计数,第二个用于围绕val旋转R,Y,C,从而避免昂贵的联接操作(请参阅)

关于布尔运算的问题:我使用了bincond运算符。 如果您不需要计数,您可以使用IsEmpty(bag)而不是SIZE(bag),它会稍微快一点,以获得0和1的转换