私はちょうど今この問題に遭遇しました。問題を解決するには、メソッド SequenceFilesFromMailArchivesTest.testSequential を次のように変更できることがわかりました。
@Test
public void testSequential() throws Exception {
File outputDir = this.getTestTempDir("mail-archives-out");
String[] args = {
"--input", inputDir.getAbsolutePath(),
"--output", outputDir.getAbsolutePath(),
"--charset", "UTF-8",
"--keyPrefix", "TEST",
"--method", "sequential",
"--body", "--subject", "--separator", ""
};
// run the application's main method
SequenceFilesFromMailArchives.main(args);
// app should create a single SequenceFile named "chunk-0" in the output dir
File expectedChunkFile = new File(outputDir, "chunk-0");
String expectedChunkPath = expectedChunkFile.getAbsolutePath();
Assert.assertTrue("Expected chunk file " + expectedChunkPath + " not found!", expectedChunkFile.isFile());
Configuration conf = new Configuration();
SequenceFileIterator<Text, Text> iterator = new SequenceFileIterator<Text, Text>(new Path(expectedChunkPath), true, conf);
Assert.assertTrue("First key/value pair not found!", iterator.hasNext());
Pair<Text, Text> record ;//= iterator.next();
/*
File parentFile = new File(new File(new File("TEST"), "subdir"), "mail-messages.gz");
Assert.assertEquals(new File(parentFile, testVars[0][0]).toString(), record.getFirst().toString());
Assert.assertEquals(testVars[0][1] + testVars[0][2], record.getSecond().toString());
Assert.assertTrue("Second key/value pair not found!", iterator.hasNext());
record = iterator.next();
Assert.assertEquals(new File(parentFile, testVars[1][0]).toString(), record.getFirst().toString());
Assert.assertEquals(testVars[1][1] + testVars[1][2], record.getSecond().toString());
*/
record = iterator.next();
File parentFileSubSubDir = new File(new File(new File(new File("TEST"), "subdir"), "subsubdir"), "mail-messages-2.gz");
Assert.assertEquals(new File(parentFileSubSubDir, testVars[0][0]).toString(), record.getFirst().toString());
Assert.assertEquals(testVars[0][1] + testVars[0][2], record.getSecond().toString());
Assert.assertTrue("Second key/value pair not found!", iterator.hasNext());
record = iterator.next();
Assert.assertEquals(new File(parentFileSubSubDir, testVars[1][0]).toString(), record.getFirst().toString());
Assert.assertEquals(testVars[1][1] + testVars[1][2], record.getSecond().toString());
/////////Modified By ZhouShuang/////////////
record = iterator.next();
File parentFile = new File(new File(new File("TEST"), "subdir"), "mail-messages.gz");
Assert.assertEquals(new File(parentFile, testVars[0][0]).toString(), record.getFirst().toString());
Assert.assertEquals(testVars[0][1] + testVars[0][2], record.getSecond().toString());
Assert.assertTrue("Second key/value pair not found!", iterator.hasNext());
record = iterator.next();
Assert.assertEquals(new File(parentFile, testVars[1][0]).toString(), record.getFirst().toString());
Assert.assertEquals(testVars[1][1] + testVars[1][2], record.getSecond().toString());
//////////Modified By ZhouShuang////////////
Assert.assertFalse("Only two key/value pairs expected!", iterator.hasNext());
}
この問題は、listFiles() によって返される File[] 内のファイルがランダムにソートされているために発生しました。それを確認するためのテストプログラムを作成しました。次のシーケンスになります: /home/alain/mytests/subsubdir /home/alain/mytests/mail-messages.gz そして PrefixAdditionFilter クラスの accept() メソッドに従って、ディレクトリ内のファイルを再帰的にシーケンスファイル。そのため、iterator.next を使用して SequenceFile のキー値を取得すると、最初に subsubdir/mail-messages-2.gz を取得し、次に mail-messages.gz を取得します。しかし、元の testSequential() 関数では、最初に mail-messages.gz をチェックし、次に subsubdir/mail-messages-2.gz をチェックします。なので順番が逆。注文を変更しただけで大丈夫です。注意: 2 つの SequenceFilesFromMailArchivesTest.java ファイルがあります。1 つは配布パッケージにあり、もう 1 つは統合パッケージにあります。後で変更する必要があります。私は間違いを犯しました:)