我想将字段转换为Pig中的行。
来自input.txt的
1 2 3 4 5 6 7 8 9
字段之间的分隔符是'\ t'。
到output.txt
1 2 3 4 ... 但我不能使用TOKENIZER,因为字段的内容可能是一个句子。 请帮我。 非常感谢。
答案 0 :(得分:5)
我认为alexeipab的答案是正确的方向。这是一个简单的例子:
> A = load 'input.txt';
> dump A
(0,1,2,3,4,5,6,7,8,9)
> B = foreach A generate FLATTEN(TOBAG(*));
> dump B
(0)
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
答案 1 :(得分:4)
我使用Pig遇到了一个非常类似的问题。我最终做的是编写一个UDF,它只是遍历元组。对于元组中的每个字段,它将创建一个具有字段值的新元组并将其添加到数据库。这是一个样本......
public DataBag exec(Tuple tuple) throws IOException {
DataBag db = BagFactory.getInstance().newDefaultBag();
for(int i = 0; i < tuple.size(); ++i){
DefaultTuple dt = new DefaultTuple();
dt.append(tuple.get(i));
db.add(dt);
}
return db;
}
显然,这不包括任何错误检查,因为它是一个示例,但它可以帮助您了解如何执行此操作。
在您的脚本中,您可以“平移”结果,并在需要时将单个值重新放回单个元组中。
答案 2 :(得分:0)
看起来你想要转动行。有几种解决方案可以看Pivot table with Apache Pig或Splitting a tuple into multiple tuples in Pig
答案 3 :(得分:0)
使用DataFu UDF TransposeTupleToBag(http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/TransposeTupleToBag.html)获取一个包含来自元组转置字段的包。将行囊展平以获得行(键:chararray,值:chararray)元组。选择&#39;值&#39;部分来自展平输出。