【问题标题】:Reading Values from a Bag of Tuples in pig从猪的一袋元组中读取值
【发布时间】:2017-03-04 18:54:18
【问题描述】:

我的 UDF 输出为:-

样本记录:- ({(托德,1),(托德,1),(托德,1),(托德,1),(托德,1),(托德,5),(托德,10),(托德,20), (托德,10),(托德,10),(托德,10),(托德,10),(托德,10),(托德,10)})

({(乔恩,1),(乔恩,1),(乔恩,1),(乔恩,1),(乔恩,1),(乔恩,5),(乔恩,10),(乔恩, 20),(乔恩,10),(乔恩,10),(乔恩,10),(乔恩,10),(乔恩,5),(乔恩,20),(乔恩,1)})

UDF 的架构:- name:chararray(1 个单列)

现在我想读取这组元组并将输出生成为:-

Todd,240
Jon,422

我将 UDF 的输出存储在一个临时文件中,并使用不同的模式将其读回:-

D = LOAD '/home/training/pig/pig/UDFdata.txt' AS (B: bag {T: tuple(name:chararray, denom:int)});

之后我尝试使用 foreach 循环和引用点符号来查找总和。

X = foreach D generate B.T.name,SUM(B.T.denom);

2017-03-04 13:52:59,507 错误 org.apache.pig.tools.grunt.Grunt:错误 1128: 在名称中找不到字段 T:chararray,denom:int 详细信息位于 日志文件:/home/training/pig_1488648405070.log

你能告诉我如何找到它吗?我是 Apache Pig 的新手,所以不确定它是如何在 Bag of Tuples 中遍历并找到 sum 的。

【问题讨论】:

    标签: tuples apache-pig


    【解决方案1】:

    在执行 SUM 之前将数据集按名称分组。

    FLATTEN 包执行GROUP

    flattened = FOREACH D GENERATE FLATTEN(B);
    
    dump flattened;
    ...
    (Todd,10)
    (Todd,10)
    (Jon,1)
    (Jon,1)
    ....
    

    然后,GROUP他们在name

    grouped = GROUP flattened by name;
    
    dump grouped;
    (Jon,{(Jon,1),(Jon,20),(Jon,5),(Jon,10),(Jon,10),(Jon,10),(Jon,10),(Jon,20),(Jon,10),(Jon,5),(Jon,1),(Jon,1),(Jon,1),(Jon,1),(Jon,1)})
    (Todd,{(Todd,10),(Todd,10),(Todd,10),(Todd,10),(Todd,10),(Todd,10),(Todd,20),(Todd,10),(Todd,5),(Todd,1),(Todd,1),(Todd,1),(Todd,1),(Todd,1)})
    

    并在结果上应用SUM()

    final_sum = FOREACH grouped GENERATE group, SUM(flattened.denom);
    
    dump final_sum;
    (Jon,106)
    (Todd,100)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2012-05-11
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      相关资源
      最近更新 更多