猪:袋到元组

时间:2015-05-28 13:25:24

标签: mapreduce apache-pig

我是猪的新手,仍在探索做简单事情的有效方法。 例如,我有一袋事件

{"events":[{"event": ev1}, {"event": ev2}, {"event":ev3}, ....]}

我希望将其视为一个元组,例如

{"events":[ev1, ev2, ev3, ....]}

猪有没有办法实现这个目标? 我已经挣扎了一段时间,但没有太大的成功:(。

提前致谢

2 个答案:

答案 0 :(得分:0)

查看您的输入,您的架构似乎是:

A: {name:chararray, vals:{(inner_name:chararray, inner_value:chararray)}}

正如我在对你的问题的评论中提到的那样,实际上将其转换为除了inner_value之外的任何数组都是非常困难的,因为你不知道你可能有多少个字段。当你不知道字段的数量时,你应该总是尝试在Pig中使用一个包。

幸运的是,如果你实际上可以使用一个袋子,这是微不足道的:

-- Project out only inner_value from the bag vals
B = FOREACH A GENERATE name, vals.inner_value ;

答案 1 :(得分:0)

感谢大家提供的信息。他们帮助了我。

然而,我发现我错过了Schema的一个重要特征,即每个字段都有一个键和一个值(一个映射)。所以现在我通过编写UDF将包转换为逗号分隔的值字符串来实现我想要的目标:

 package BagCondenser;

 import java.io.IOException;
 import java.util.Iterator;

 import org.apache.pig.EvalFunc;
 import org.apache.pig.data.DataBag;
 import org.apache.pig.data.Tuple;


 public class BagToStringOfCommaSeparatedSegments
     extends EvalFunc<String> {

    @Override
    public String exec(Tuple input) throws IOException {

          // Condensed bag to be returned
          String listOfSegmentIds = new String("");

          // Cast the input to a bag
          Object inputObject = input.get(0);

          // Throw error if not bag-able input
          if (!(inputObject instanceof DataBag))
              throw new IOException("Expected input to be a bag, but got: "
                   + inputObject.getClass());

          // The input bag
          DataBag bag = (DataBag) inputObject;
          Iterator it = bag.iterator();

         // Collect second fields of each tuple and add to the output bag
         while(it.hasNext()) {
             // If the return string already had values, append a ','
             if ( ! listOfSegmentIds.equals("") )
                 listOfSegmentIds += ",";

             Tuple tuple = (Tuple) it.next();

             listOfSegmentIds += tuple.get(0).toString();
        }

        return listOfSegmentIds;

    }

 }
相关问题