Junit 与UDF有关的问题

Junit 与UDF有关的问题,junit,apache-pig,udf,Junit,Apache Pig,Udf,我有一个UDF,它接受一个包作为输入,并将其转换为地图。地图的每个键都由包中不同的元素和对应于其计数的值组成 但是它没有通过junit测试看起来您除了使用一个包含两个元组的包之外,实际上您正在创建一个包含两个字段的元组的包 此代码: DataBag dataBag = bagFactory.newDefaultBag(); Tuple nestedTuple = tupleFactory.newTuple(2); nestedTuple.set(0, "12345"); nestedTuple.

我有一个UDF,它接受一个包作为输入,并将其转换为地图。地图的每个键都由包中不同的元素和对应于其计数的值组成


但是它没有通过junit测试

看起来您除了使用一个包含两个元组的包之外,实际上您正在创建一个包含两个字段的元组的包

此代码:

DataBag dataBag = bagFactory.newDefaultBag();
Tuple nestedTuple = tupleFactory.newTuple(2);
nestedTuple.set(0, "12345");
nestedTuple.set(1, "12345");
dataBag.add(nestedTuple);
应转变为:

DataBag dataBag = bagFactory.newDefaultBag();
Tuple tupleA = tupleFactory.newTuple(1);
tupleA.set(0, "12345");
dataBag.add(tupleA);

Tuple tupleB = tupleFactory.newTuple(1);
tupleB.set(0, "12345");
dataBag.add(tupleB);

或者您可以迭代所有元组的字段。

1的输出是正确的:在UDF中,您正在计算第一个字段中具有相同值的元组数,但在测试中,您只添加了一个具有两个值的元组

如果您想要计算与“key”值相同的元组数(其中key是元组中的第一个值),那么您所做的是正确的,但您必须更改测试:

public void testExecWithSimpleMap() throws Exception {
    Tuple inputTuple = tupleFactory.newTuple(1);
    DataBag dataBag = bagFactory.newDefaultBag();
    Tuple nestedTuple = tupleFactory.newTuple(2);
    nestedTuple.set(0, "12345");
    nestedTuple.set(1, "another value");
    dataBag.add(nestedTuple);

    // Add a second tuple
    nestedTuple.set(0, "12345");
    nestedTuple.set(1, "and another value");
    dataBag.add(nestedTuple);
    inputTuple.set(0,dataBag);
    Map output = testClass.exec(inputTuple);
    assertEquals(output.size(), 1);
    System.out.println(output.get("12345"));
    assertEquals(output.get("12345"),2);
}
但是,如果您想计算一个值在整个包中重复了多少次,无论是在不同元组上还是在同一元组上(您的问题中不太清楚),那么您需要更改您的UDF:

public class BagToMap extends EvalFunc<Map> {
    public Map exec(Tuple input) throws IOException {
        if(input == null) {
            return null;
        }
        DataBag values = (DataBag)input.get(0);
        Map<String, Integer> m = new HashMap<String, Integer>();
        for (Iterator<Tuple> it = values.iterator(); it.hasNext();) {
            Tuple t = it.next();

            // Iterate through the Tuple as well
            for (Iterator<Object> it2 = t.iterator(); it2.hasNext();) {
                Object o = it2.next();
                String key = o.toString();

                if(m.containsKey(key)) {
                    m.put(key, m.get(key)+1);
                } else {
                    m.put(key, 1);
                }
            }
        }
        return m;
    }
}
公共类BagToMap扩展了EvalFunc{
公共映射执行器(元组输入)引发IOException{
如果(输入==null){
返回null;
}
数据包值=(数据包)输入.get(0);
Map m=新的HashMap();
for(Iterator it=values.Iterator();it.hasNext();){
Tuple t=it.next();
//也可以遍历元组
for(迭代器it2=t.Iterator();it2.hasNext();){
对象o=it2.next();
字符串键=o.toString();
如果(m.containsKey(钥匙)){
m、 put(键,m.get(键)+1);
}否则{
m、 put(键,1);
}
}
}
返回m;
}
}

在这种情况下,您的测试应该通过。

哪个assertEquals失败?请注意,调用assertEquals的正确方法是
assertEquals(int-expected,int-actual)
,而不是第二种方法失败的另一种方法构造数据库的方法是错误的。我建议使用调试器。