猪:包到元组

Posted

技术标签:

【中文标题】猪:包到元组【英文标题】:Pig: Bag to Tuple 【发布时间】:2015-05-28 13:25:23 【问题描述】:

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

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

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

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

有没有办法在 Pig 中实现这一点? 我已经为此苦苦挣扎了一段时间,但没有太大成功:(。

提前致谢

【问题讨论】:

您知道需要转换的字段数吗?仅当您确切知道将拥有多少个字段/列时,才应该使用元组。 没有。该集合将是动态的。我只是不再想要那个重复的“事件”键,因为它在这里没有特殊用途。 那么你就可以将事件字段投影出来了。 latin pig bag to tuple after group by的可能重复 感谢您的参考。尽管我认为该解决方案不能回答我的问题,因为我已经将所有事件分组。我只需要一种机制来遍历包并从每个元组中剥离键字符串(“事件”:Val)。 【参考方案1】:

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

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

正如我在对您的问题的评论中提到的那样,实际上将其转换为除inner_values 之外的其他数组将非常困难,因为您不知道您可能拥有多少个字段。当您不知道字段数时,您应该始终尝试在 Pig 中使用包。

幸运的是,如果您实际上可以为此使用一个包,那是微不足道的:

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

【讨论】:

【参考方案2】:

感谢所有提供信息的 cmets。他们帮助了我。

但是,我发现我缺少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;

    

 

【讨论】:

以上是关于猪:包到元组的主要内容,如果未能解决你的问题,请参考以下文章

将项目添加到 Django 中的元组元组后是不是可以重新启动服务器?

Python将项目添加到元组

scala zip列表到元组

如何将列表合并到元组列表中?

将列表作为单个元素插入到元组中

Haskell:如何附加到元组列表列表?