0

我有这样的一行数据:

a\tb1,b2,..,bn\tc1,c2,..,cn

其中 n 是不确定的。现在,我想将其转换为如下几行:

a\tb1\tc1
a\tb2\tc2
...
a\tbn\tcn

可以通过猪拉丁语实现,还是必须使用UDF?如果使用脚本:

A = LOAD 'file' AS (a, b, c);
B = FOREACH A GENERATE a, FLATTEN(TOKENIZE(b)), FLATTEN(TOKENIZE(c));
dump B;

我将得到如下结果:

a\tb1\tc1
a\tb1\tc2
..
a\tb1\tcn
a\tb2\tc1
a\tb2\tc2
..
a\tb2\tcn
..

这不是我想要的数据。有人有想法吗?

4

2 回答 2

1

IMO 太多使用 Pig 的人拒绝编写 UDF。在您的情况下,您需要执行此操作的 UDF 相当简单。这是示例代码(未经测试)

public class InSequenceJoin extends EvalFunc<DataBag>
{
    public DataBag exec(Tuple input) throws IOException {
        String b = (String) input.get(0);
        String c = (String) input.get(1);
        String[] bArray = b.split(",");
        String[] cArray = c.split(",");
        DataBag bag = BagFactory.getInstance().newDefaultBag();
        for (int i = 0; i < bArray.length && i < cArray.length; i++) {
            Tuple tuple = TupleFactory.getInstance.newTuple(2);
            tuple.set(0, bArray[i]);
            tuple.set(1, cArray[i]);
            bag.add(tuple);
        }
        return bag;
    }
}

define InSequenceJoin mysourcepath.InSequenceJoin();
A = LOAD 'file' AS (a, b, c);
B = FOREACH A GENERATE a, FLATTEN(InSequenceJoin(b,c));
dump B;

如果需要,您可以在 UDF 中添加对数组大小是否匹配的验证。您可以将我在示例中使用的字符串拆分替换为您真正需要的任何内容。

于 2013-05-24T04:11:47.393 回答
0

我会尝试使用 datafu 的包 UDF。

按照您的操作加载数据,然后使用 Enumerate 枚举袋子元素,然后展平(这为您提供袋子元素之间的交叉连接,如您所见),然后您可以过滤添加到袋子元素的索引.

见这里:https ://github.com/linkedin/datafu

于 2013-05-23T11:46:23.313 回答