2

ORC ファイルを処理するマップ プログラムがあります。ドライバーから orcformat を入力フォーマットとして設定しました。

job.setInputFormatClass(OrcNewInputFormat.class); 

OrcNewInputFormat では、値は OrcStruct です。Map メソッドでは Writable 値がパラメーターとして渡され (value param)、以下のようにマップ内の OrcStruct に型キャストされます。

OrcStruct record = (OrcStruct) value

MRUnit を使用してこのマッパーをテストしたいと考えています。このために、単体テストのセットアップ メソッドで、testFilePath に ORC ファイルを作成します。

 OrcFile.createWriter(testFilePath,  OrcFile.writerOptions(conf).inspector(inspector).stripeSize(100000).bufferSize(10000).version(OrcFile.Version.V_0_12));
writer.addRow(new SimpleStruct("k1", "v1")) ;

public static class SimpleStruct {
    Text k;
    Text string1;

    SimpleStruct(String b1, String s1) {
        this.k = new Text(b1);
        if (s1 == null) {
            this.string1 = null;
        } else {
            this.string1 = new Text(s1);
        }
    }
}

次に、テスト メソッドでそれを読み取り、MRUnit 呼び出しマッパーを使用します。以下はコードです

// Read orc file
Reader reader = OrcFile.createReader(fs, testFilePath) ;  
RecordReader recordRdr = reader.rows() ;
OrcStruct row = null ;
List<OrcStruct> mapData = new ArrayList<>()

while(recordRdr.hasNext()) { 
    row = (OrcStruct) recordRdr.next(row) ;
    mapData.add(row) ; 
}

// test mapper
initializeSerde(mapDriver.getConfiguration());

Writable writable = getWritable(mapData.get(0))  ; // test 1st record's mapper processing
mapDriver.withCacheFile(strCachePath).withInput(NullWritable.get(), writable );
mapDriver.runTest(); 

しかし、テストケースの実行中にエラーが発生します

java.lang.UnsupportedOperationException: can't write the bundle
at org.apache.hadoop.hive.ql.io.orc.OrcSerde$OrcSerdeRow.write(OrcSerde.java:61)
at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:98)
at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:82)
at org.apache.hadoop.mrunit.internal.io.Serialization.copy(Serialization.java:80)
at org.apache.hadoop.mrunit.internal.io.Serialization.copy(Serialization.java:97)
at org.apache.hadoop.mrunit.internal.io.Serialization.copyWithConf(Serialization.java:110)
at org.apache.hadoop.mrunit.TestDriver.copy(TestDriver.java:675)
at org.apache.hadoop.mrunit.TestDriver.copyPair(TestDriver.java:679)
at org.apache.hadoop.mrunit.MapDriverBase.addInput(MapDriverBase.java:120)
at org.apache.hadoop.mrunit.MapDriverBase.withInput(MapDriverBase.java:210)

orcserde を見ると、MRUnit が呼び出す write がサポートされていないことがわかります。したがって、テスト ケースのエラーが発生します。

Orc ファイルを処理しているマッパーをどのようにユニット テスト ケースしますか。私がしていることに他の方法や何を変更する必要がありますか?

助けてくれてありがとう。

4

0 に答える 0