我正在用mrunit测试我的Map。我将键和值列表作为输入从测试类传递给Map器。问题是:
String key=1234_abc;
ArrayList<KeyValue> list = new ArrayList<KeyValue>();
KeyValue k1 = new KeyValue(Bytes.toBytes(key),"cf".getBytes(), "Val1".getBytes(),Bytes.toBytes("abc.com"));
KeyValue k2 = new KeyValue(Bytes.toBytes(key), "cf".getBytes(), "Val2".getBytes(),Bytes.toBytes("165"));
Result result = new Result(list);
mapDriver.withInput(key, result);
问题是在结果对象中只保留第一个键值。其他的被存储为空。
2条答案
按热度按时间r6vfmomb1#
我自己在这个问题上经历了6个小时的痛苦,终于发现了问题所在。它似乎是org.apache.hadoop.hbase.client.result类中的一个bug,至少对于我正在使用的hbase版本(0.94.18)。
result.getvalue()调用getcolumnlatest(),其中包含对binarysearch()的调用。binarysearch()方法似乎有问题,几乎总是返回错误的索引。getcolumnlatest()通过确保族和限定符匹配,双重检查是否确实找到了正确的keyvalue。它们通常不是匹配项,并且返回null。
我最终重新实现了getvalue()方法和它使用的3个方法,然后在单元测试中切换到功能正确的实现。可能有更好的方法来实现这一点,但为时已晚,这就是我想到的(它确实解决了问题):
ipakzgxi2#
问题是hbase按字典顺序存储列。结果(keyvalue[]kvs)或结果(list kvs)构造函数的预期顺序相同。
这就是解决办法!
希望这会有帮助!