pig:包到元组

vwhgwdsa  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(374)

我对Pig还很陌生,仍然在探索做简单事情的有效方法。例如,我有一包事件

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

我想把它折叠成一个元组,比如

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

有没有办法在Pig身上实现这一点?我已经挣扎了一段时间,但没有取得太大的成功:(。
提前谢谢

0x6upsns

0x6upsns1#

从您的输入来看,您的模式类似于:

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 ;
wko9yo5t

wko9yo5t2#

谢谢大家的宝贵意见。他们帮助了我。
然而,我发现我遗漏了 Schema ,即每个字段都有一个键和一个值(Map)。因此,现在我通过编写一个自定义项将包转换为逗号分隔的值字符串来实现我想要的:

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;

    }

 }

相关问题