Apache pig 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”记录的数量 我知道我可以先按记录类型、组和聚合进行筛选,但这会导致三个子报告的昂贵合并。我宁愿分组一次,并在我的组中生成每个{R,Y,C}列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”记录的
如何将数据集中第二列与“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的转换