猪脚本按位置匹配元组条目

时间:2014-08-01 21:35:54

标签: hadoop apache-pig

我有一个包含两列的文件,每列都以逗号分隔列表: a,b,c 0.27,0.32,0.02

我希望将其拆分为多行,使第一列中的每个条目与第二列中的相应条目匹配。它们将始终具有相同数量的条目。我想要的输出是:

a   0.27
b   0.32
c   0.02

我试图对两列进行整理和展平,但这给了我9行

a   0.27
a   0.32
a   0.02
b   0.27
b   0.32
b   0.02
c   0.27
c   0.32
c   0.02

这不是我想要的。什么是正确的方法?

1 个答案:

答案 0 :(得分:0)

请检查以下代码:
A =使用PigStorage()作为(firstcol:chararray,secondcol:chararray)加载'inp';

first_part = foreach生成flatten(col2row(firstcol))as(count:int,value:chararray); second_part = foreach生成flatten(col2row(secondcol))as(count:int,value:chararray);

加入=按count计数加入first_part,按计数加入second_part; output = foreach joined生成first_part :: value as col1,second_part :: value as col2;

转储输出;

和UDF col2row是: public class col2row1扩展了EvalFunc {

TupleFactory mTupleFactory = TupleFactory.getInstance();
BagFactory mBagFactory = BagFactory.getInstance();


public DataBag exec(Tuple input) throws IOException {
    // TODO Auto-generated method stub
    String inp = (String) input.get(0);
    int count = 0;
    DataBag out = mBagFactory.newDefaultBag();

    StringTokenizer st = new StringTokenizer(inp,",");
    while(st.hasMoreElements())
    {       
        count++;

        Tuple t1 = mTupleFactory.newTuple();
        t1.append(count);
        t1.append(st.nextElement());
        out.add(t1);
    }
    return out;
}

如果你想在Pig中使用内置的TOKENIZE,那么你可以在UDF中稍作改动。然后UDF应该将Bag作为输入而不是字符串。基本上我试图做的是修改输入的两个部分 - a,b,c& 0.27,0.32,0.02 as:
 (1,a)(2,b)(3,c)&
 (1,0.27)(2,0.32)(3,0.02)。

然后我根据第一个变量执行连接,得到所需的输出