JSON でエンコードを検出できないFailure to detect encoding in JSON

問題Problem

Spark ジョブは、次のメッセージを含む例外で失敗します。Spark job fails with an exception containing the message:

Invalid UTF-32 character 0x1414141(above 10ffff)  at char #1, byte #7)
At org.apache.spark.sql.catalyst.json.JacksonParser.parse

原因Cause

JSON データソースリーダーは、ファイルの先頭に BOM を使用して、入力 json ファイルのエンコードを自動的に検出できます。The JSON data source reader is able to automatically detect encoding of input JSON files using BOM at the beginning of the files. ただし、BOM は Unicode 規格では必須ではなく、 RFC 7159 では禁止されています (例: 8.1)。However, BOM is not mandatory by Unicode standard and prohibited by RFC 7159 for example, section 8.1:

"...実装では、JSON テキストの先頭にバイトオーダーマークを追加することはできません。 "“…Implementations MUST NOT add a byte order mark to the beginning of a JSON text.”

その結果、場合によっては、Spark が文字セットを正しく検出して JSON ファイルを読み取ることができないことがあります。As a consequence, in some cases Spark is not able to detect the charset correctly and read the JSON file.

解決策Solution

この問題を解決するには、charset 自動検出機構を無効にし、オプションを使用して明示的に文字セットを設定し encoding ます。To solve the issue, disable the charset auto-detection mechanism and explicitly set the charset using the encoding option:

.option("encoding", "UTF-16LE")