3

したがって、次のようなものを使用します。

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])); スキャナーの代わりに....

4

1 に答える 1