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")