我有一个包含两列的文件,每列都以逗号分隔列表: 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
这不是我想要的。什么是正确的方法?
答案 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)。
然后我根据第一个变量执行连接,得到所需的输出