猪:包到元组
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_value
s 之外的其他数组将非常困难,因为您不知道您可能拥有多少个字段。当您不知道字段数时,您应该始终尝试在 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;
【讨论】:
以上是关于猪:包到元组的主要内容,如果未能解决你的问题,请参考以下文章