【问题标题】:Basic statistics with Apache PigApache Pig 的基本统计
【发布时间】:2017-08-12 10:10:32
【问题描述】:

我正在尝试使用 Apache Pig 来表征具有某些属性的行的分数。

例如,如果数据如下所示:

    a,15
    a,16
    a,17
    b,3
    b,16

我想得到:

    a,0.6
    b,0.4

我正在尝试执行以下操作:

    A = LOAD 'my file' USING PigStorage(',');
    total = FOREACH (GROUP A ALL) GENERATE COUNT(A);

这给了我总计 = (5),但是当我尝试使用这个“总计”时:

    fractions = FOREACH (GROUP A by $0) GENERATE COUNT(A)/total;

我得到一个错误。

显然 COUNT() 返回某种投影,并且两个投影(在计算总数和分数时)应该是一致的。有没有办法使这项工作?或者只是将总数转换为一个数字并避免这种投影一致性要求?

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    另一种方法:

    test = LOAD 'test.txt' USING PigStorage(',') AS (one:chararray,two:int);
    B = GROUP test by $0;
    C = FOREACH B GENERATE group, COUNT(test.$0);
    D = GROUP test ALL;
    E = FOREACH D GENERATE group,COUNT(test.$0);
    F = CROSS C,E;
    G = FOREACH F GENERATE $0,$1,$3,(double)($1*100/$3);
    
    Output:
    (a,3,5,0.6)
    (b,2,5,0.4)
    

    【讨论】:

    • 这完全可行,谢谢!不知道为什么其他看起来更简单的解决方案没有。
    • 如果有帮助,请您接受答案:)
    • 我发布了一个答案,该答案构成了对我收到的另一个回复的更正。我认为在这种情况下最好不要使用 CROSS,因为它至少在原则上计算量很大。
    【解决方案2】:

    你将不得不投影并将其转换为双倍:

    total = FOREACH (GROUP A ALL) GENERATE COUNT(A);
    rows = FOREACH (GROUP A by $0) GENERATE group,COUNT(A);
    fractions = FOREACH rows GENERATE rows.$0,(double)rows.$1/(double)total.$0;
    

    【讨论】:

    • @inquisitive-mind 语法有问题吗?此代码无法在 pig-12 或 pig-15 中解析。抱怨第 4 行第 40 列意外字符(假设 LOAD 操作是第 1 行)。谢谢!
    • @TnatsissaHCraeser 试试这个点。即 rows.$0,(double)rows.$1/(double)total.$0;
    • @nquisitive_mind 这会解析,但以一种神秘的方式失败(使用上面的示例):“标量在输出中有不止一行。第一:(3,1),第二:(15, 1)"。请注意,第一个来自 b,3 而第二个来自输入中的 a,15。这似乎表明超过 1 行的神秘标量实际上是“总数”,如果是这样,则可能是投影问题...
    • DUMP 总计是多少;给?超过 1 行?
    • @nquisitive_mind 不,它没有。顺便说一句,我错误地在我的问题中输入了 $1,这使它成为你的答案(我很抱歉),但我看到的错误来自更正的版本:“Scalar 在输出中有不止一行。第一个 :(a, 3), 2nd :(b,2)"
    【解决方案3】:

    出于某种原因,对@inquisitive-mind 建议的内容进行了以下修改:

      total = FOREACH (GROUP A ALL) GENERATE COUNT(A);
      rows = FOREACH (GROUP A by $0) GENERATE group as colname, COUNT(A) as cnt;
      fractions = FOREACH rows GENERATE colname, cnt/(double)total.$0;
    

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多