如何在Pig中将字段转换为行?

时间:2012-07-11 07:43:54

标签: tokenize apache-pig

我想将字段转换为Pig中的行。

来自input.txt的

1 2 3 4 5 6 7 8 9

字段之间的分隔符是'\ t'。

到output.txt

1 2 3 4 ... 但我不能使用TOKENIZER,因为字段的内容可能是一个句子。 请帮我。 非常感谢。

4 个答案:

答案 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 PigSplitting 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;部分来自展平输出。