バッグを入力として受け取り、それをマップに変換する UDF があります。マップの各キーは、バッグ内の個別の要素とそのカウントに対応する値で構成されます
しかし、それはjunitテストに失敗しています
バッグを入力として受け取り、それをマップに変換する UDF があります。マップの各キーは、バッグ内の個別の要素とそのカウントに対応する値で構成されます
しかし、それはjunitテストに失敗しています
2 つのタプルのバッグを使用しているように見えますが、実際には 2 つのフィールドを持つタプルを含むバッグを作成しています。
このコード:
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 では、最初のフィールドに同じ値を持つタプルの数を数えていますが、テストでは、2 つの値を持つタプルを 1 つだけ追加しています。
「キー」と同じ値 (キーはタプルの最初の値) を持つタプルの数をカウントしたい場合、実行していることは正しいですが、テストを変更する必要があります。
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;
}
}
この場合、テストは成功するはずです。