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;
}
}
2条答案
按热度按时间0x6upsns1#
从您的输入来看,您的模式类似于:
正如我在对你的问题的评论中提到的,实际上把它变成了一系列
inner_value
因为你不知道你可能会有多少个字段,所以这将是非常困难的。当你不知道字段的数目时,你应该尽量用Pig的袋子。幸运的是,如果你真的能用一个袋子来做这件事,那就很简单了:
wko9yo5t2#
谢谢大家的宝贵意见。他们帮助了我。
然而,我发现我遗漏了
Schema
,即每个字段都有一个键和一个值(Map)。因此,现在我通过编写一个自定义项将包转换为逗号分隔的值字符串来实现我想要的: