したがって、次のようなものを使用します。
for (int i = 0; i < files.length; i++) {
if (!files[i].isDirectory() && files[i].canRead()) {
try {
Scanner scan = new Scanner(files[i]);
System.out.println("Generating Categories for " + files[i].toPath());
while (scan.hasNextLine()) {
count++;
String line = scan.nextLine();
System.out.println(" ->" + line);
line = line.split("\t", 2)[1];
System.out.println("!- " + line);
JsonParser parser = new JsonParser();
JsonObject object = parser.parse(line).getAsJsonObject();
Set<Entry<String, JsonElement>> entrySet = object.entrySet();
exploreSet(entrySet);
}
scan.close();
// System.out.println(keyset);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Hadoop 出力ファイルを調べると、途中の JSON オブジェクトの 1 つが壊れています... scan.nextLine() が分割する前に行全体を取得していないためです。つまり、出力は次のとおりです。
->0 {"Flags":"0","transactions":{"totalTransactionAmount":"0","totalQuantitySold":"0"},"listingStatus":"NULL","conditionRollupId":"0","photoDisplayType":"0","title":"NULL","quantityAvailable":"0","viewItemCount":"0","visitCount":"0","itemCountryId":"0","itemAspects":{ ... "sellerSiteId":"0","siteId":"0","pictureUrl":"http://somewhere.com/45/x/AlphaNumeric/$(KGrHqR,!rgF!6n5wJSTBQO-G4k(Ww~~
!- {"Flags":"0","transactions":{"totalTransactionAmount":"0","totalQuantitySold":"0"},"listingStatus":"NULL","conditionRollupId":"0","photoDisplayType":"0","title":"NULL","quantityAvailable":"0","viewItemCount":"0","visitCount":"0","itemCountryId":"0","itemAspects":{ ... "sellerSiteId":"0","siteId":"0","pictureUrl":"http://somewhere.com/45/x/AlphaNumeric/$(KGrHqR,!rgF!6n5wJSTBQO-G4k(Ww~~
上記のデータのほとんどはサニタイズされています (ただし、(ほとんどの場合) URL ではありません...)
URL は次のように続きます: ファイル内の $(KGrHqZHJCgFBsO4dC3MBQdC2)Y4Tg~~60_1.JPG?set_id=8800005007....
そのため、少し気分が悪くなっています。
これもエントリ #112 で、他のファイルをエラーなしで解析しました... しかし、主に scan.nextLine() がどのように機能しないかがわからないため、これは私の心を台無しにしています...
デバッグ出力によると、JSON エラーは、文字列が適切に分割されていないことが原因です。
そして、ほとんど忘れていましたが、問題のある行を独自のファイルに入れて、それを解析しようとすると、うまく機能します。
編集:問題のある行をほぼ同じ場所で削除すると、爆発します。
JVM 1.6 および 1.7 で試行
回避策の解決策: BufferedReader scan = new BufferedReader(new FileReader(files[i])); スキャナーの代わりに....