【问题标题】:PIG Programming猪编程
【发布时间】:2015-01-10 01:22:48
【问题描述】:

如何编写 PIG 查询来获取字段中值的存在次数?

例如:

字段 A |字段B

20|ABC;

21|XYZ;

25|空;

99|WER;

45|空;

89|FOY;


必需的 O/P :字段 A 的计数 = 6,字段 B 的计数 = 4

【问题讨论】:

    标签: mapreduce apache-pig


    【解决方案1】:

    Pig 不会将上述输入视为null,它基本上是chararray,因此所有内置函数(is null, is not null)在这种情况下都不起作用。您需要对所有字段进行分组,过滤掉空值并获取计数。你可以试试下面的脚本吗?

    输入

    20|ABC;
    21|XYZ;
    25|null;
    99|WER;
    45|null;
    89|FOY;
    

    PigScript:

    A = LOAD 'input' USING PigStorage('|') AS (f1:int,f2:chararray);
    B = GROUP A ALL;
    C = FOREACH B {
                    filterNull =  FILTER A BY (f2!='null;');
                    GENERATE COUNT(A.f1) AS fieldA, COUNT(filterNull.f2) AS fieldB;
                  }
    DUMP C;
    

    输出:

    (6,4)
    

    【讨论】:

      【解决方案2】:

      请找到要遵循的步骤以获取输出

      fieldcount =  load '/user/examples/stackoverflow/count.txt' using PigStorage('|') as (a:int, b:chararray); 
      
      fieldcount1 = FOREACH fieldcount GENERATE a, REPLACE(b,';','') as b;
      
      fieldcount2 = GROUP fieldcount1 ALL;
      
      fieldcount3 = FOREACH fieldcount2 {
          a_cnt = FILTER fieldcount1 BY a is not null;
          b_cnt = FILTER fieldcount1 BY b is not null and b != 'null' ;
          GENERATE COUNT(a_cnt) as a_count, COUNT(b_cnt) as b_count;
      }
      

      【讨论】:

      • 条件“a_cnt”和“b_cnt”的第一个条件在任何时候都将始终为真,因为输入不包含真正的空值而不是它的字符数组。在这种情况下,“不为空”条件无论如何都不会帮助获得预期的输出。它在脚本中添加的额外条件实际上不是必需的,这就是我提到“为空”构建函数在这种情况下不起作用的原因。如果输入确实包含真正的空值,那么不需要做所有这些事情,只需在分组后,根据列投影计数函数。
      【解决方案3】:

      请找出答案:- 我的样本数据是

      003 Amit Delhi India 12000 
      
      004 Anil Delhi India 15000
      
      005 Deepak Delhi India 34000
      
      006 Fahed Agra India 45000
      
      007 Ravi Patna India 98777
      
      008 Avinash Punjab India 120000
      
      009 Saajan Punjab India 54000
      
      001 Harit Delhi India 20000
      
      002 Hardy Agra India 20000
      
      011  Banglore
      

      全部用空格隔开

      代码如下:-

      A = load '/edata' using PigStorage(' ') as (eid:int,name:chararray,city:chararray,country:chararray,salary:int);
      
      s = group A ALL ;
      
      result = foreach s generate COUNT(A.eid),COUNT(A.name),COUNT(A.country),COUNT(A.salary);
      
      dump result ;
      

      你会得到以下结果:-

      (10,9,9,9)
      

      【讨论】:

        【解决方案4】:

        输入

        20|ABC
        21|XYZ
        25|null
        99|WER
        45|null
        89|FOY
        

        脚本

        inputData = LOAD 'input' using PigStorage('|');
        grouped_input = GROUP inputData ALL;
        counts = FOREACH grouped_input GENERATE COUNT($1), COUNT($2);
        dump counts;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-05
          相关资源
          最近更新 更多