我有一个mapreduce工作,Map器从几个hbase表中读取数据。它在我的集群上运行良好。我正在用mrunit写一些单元测试。我试图从手动示例化的keyvalue对象列表中合成一个result对象,作为map()方法的输入。当我随后尝试读取map()方法中的几列时,似乎只有列表中的第一个keyvalue对象保留在result对象中——其他列为null。在下面的列表中,我有一个名为“0”的单列族。
private MapDriver<ImmutableBytesWritable, Result, Text, Text> mapDriver;
private HopperHbaseMapper hopperHbaseMapper;
@Before
public void setUp() {
hopperHbaseMapper = new HopperHbaseMapper();
mapDriver = MapDriver.newMapDriver(hopperHbaseMapper);
}
@Test
public void testMapHbase() throws Exception {
String testKey = "123";
ImmutableBytesWritable key = new ImmutableBytesWritable(testKey.getBytes());
List<KeyValue> keyValues = new ArrayList<KeyValue>();
KeyValue keyValue1 = new KeyValue(testKey.getBytes(), "0".getBytes(), "first_name".getBytes(), "Joe".getBytes());
KeyValue keyValue2 = new KeyValue(testKey.getBytes(), "0".getBytes(), "last_name".getBytes(), "Blow".getBytes());
keyValues.add(keyValue1);
keyValues.add(keyValue2);
Result result = new Result(keyValues);
mapDriver.withInput(key, result);
mapDriver.withOutput(new Text(testKey), new Text(testKey + "\tJoe\tBlow"));
mapDriver.runTest();
}
我是否错误地创建了结果对象?如前所述,Map器在集群上的真实hbase数据上运行良好,因此我认为是我的测试设置出了问题。
2条答案
按热度按时间ztmd8pv51#
在最新的hbase库中,result方法已被弃用,因此我们应该改用result.create方法。在写我的答案时,我面临着和问题作者一样的问题。在萨基维尔的评论中找到了解决方案。下面是用scala语言实现的sakthivel解决方案。
希望它能帮助编写hbase功能单元测试的人。
unftdfkk2#
与rowkey一样,hbase也按字典顺序存储列。所以你必须使用
TreeSet<KeyValue> set = new TreeSet<KeyValue>(KeyValue.COMPARATOR);
把这个递给我set
结果是,Result(set)
.我也把答案贴在这里了