我是猪的新手,仍在探索做简单事情的有效方法。 例如,我有一袋事件
{"events":[{"event": ev1}, {"event": ev2}, {"event":ev3}, ....]}
我希望将其视为一个元组,例如
{"events":[ev1, ev2, ev3, ....]}
猪有没有办法实现这个目标? 我已经挣扎了一段时间,但没有太大的成功:(。
提前致谢
答案 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;
}
}