2

マッパーが複数の HBase テーブルから読み取る mapreduce ジョブがあります。私のクラスターでは問題なく動作します。MRUnit を使用して遡及的にいくつかの単体テストを作成しています。map() メソッドへの入力として使用するために、手動でインスタンス化された KeyValue オブジェクトのリストから Result オブジェクトを作成しようとしています。その後、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();
}

Result オブジェクトを正しく作成していませんか? 前述のように、マッパーはクラスター上の実際の HBase データに対して正常に動作するため、テスト セットアップに問題があると思います。

4

2 に答える 2

3

行キーと同様に、HBase は列も辞書順に格納します。したがって、TreeSet<KeyValue> set = new TreeSet<KeyValue>(KeyValue.COMPARATOR); ans を使用して、これsetを Result コンストラクターなどに渡す必要がありますResult(set)

TreeSet<KeyValue> set = new TreeSet<KeyValue>(KeyValue.COMPARATOR);

byte[] row = Bytes.toBytes("row01");
byte[] cf = Bytes.toBytes("cf");
set.add(new KeyValue(row, cf, "cone".getBytes(), Bytes.toBytes("row01_cone_one")));
set.add(new KeyValue(row, cf, "ctwo".getBytes(), Bytes.toBytes("row01_ctwo_two")));
set.add(new KeyValue(row, cf, "cthree".getBytes(), Bytes.toBytes("row01_cthree_three")));
set.add(new KeyValue(row, cf, "cfour".getBytes(), Bytes.toBytes("row01_cfour_four")));
set.add(new KeyValue(row, cf, "cfive".getBytes(), Bytes.toBytes("row01_cfive_five")));
set.add(new KeyValue(row, cf, "csix".getBytes(), Bytes.toBytes("row01_csix_six")));

KeyValue[] kvs = new KeyValue[set.size()];
set.toArray(kvs);

Result result = new Result(kvs);
mapDriver.withInput(key, result);

私もここに私の答えを投稿しました

于 2015-04-23T11:25:05.980 に答える