Amazon Athena の JSON データを読み込もうとするとエラーが発生します。

最終更新日: 2019 年 11 月 18 日

Amazon Athena の JSON データを読み込もうとすると、NULL または不正なデータのエラーを受け取ります。このエラーはどのように解決すればよいですか?

解決方法

次のような一般的問題を確認します。

正しい JSON SerDe を使用していること

Athena では、次の 2 つの JSON SerDe の内 1 つを使用して JSON データを処理します。

どちらの SerDE を使っているかわからない場合は、両方の SerDE バージョンを試してみてください。 OpenX SerDe を使用する場合、次の例に示すように、誤った形式のレコードを無視して、エラーの原因となっている行を特定できます。ignore.malformed.jsontrue に設定すると、不正な形式のレコードは NULL として返されます。

CREATE EXTERNAL TABLE json (
    a string,
    b int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket';

新しいテーブルに対してクエリを実行し、誤った形式のレコードを持つファイルを特定します。例:

SELECT "$PATH", * FROM your_table where your_column is NULL

1 行 / レコードになっている

次の JSON レコードは、正しくフォーマットされています。

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }

次の JSON レコードは、不正なフォーマットです。

{
  "id" : 50,
  "name":"John"
},
{
  "id" : 51,
  "name":"Jane"
}
{
  "id" : 53,
  "name":"Jill"
}

また、間違ったフォーマットのレコードとして、次のようなものもあります。

{ "id" : 50, "name":"John" } { "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" }

各列で正しいデータ型を使用する

次の例の 2 行目には、「age」のデータ型が正しくありません。列は「11」ではなく「11」と表示されます。これにより、次のエラーメッセージが表示されます。 HIVE_BAD_DATA: フィールド 1 のフィールド値「11」の解析エラー : 入力文字列の場合 :「11」

{"name":"Patrick","age":35,"address":"North Street"}
{"name":"Carlos","age":"eleven","address":"Flowers Street"}
{"name":"Fabiana","age":22,"address":"Main Street"}

圧縮された JSON ファイルに正しい拡張子を使用する

圧縮された JSON ファイルを使用する場合、ファイルは「.json」で終わり、その後に圧縮形式の拡張子(「.gz」など)が続く必要があります。たとえば、これは gzip ファイルの正しい形式の拡張子です :「myfile.json.gz」。

列を大文字と小文字で区別していないこと、もしくは、case.insensitive プロパティの設定を false にしている

Athena では、デフォルトで大文字と小文字が区別されません。大文字と小文字のみが異なる列名(「Column」と「column」など)がある場合、Athena はエラー「HIVE_CURSOR_ERROR:Row is not a valid JSON Object-JSONException:Duplicate key」を生成し、データは Athena に表示されません。この問題を回避する最も簡単な方法は、列名を大文字と小文字で区別しないようにし、データを生成することです。

また、OpenX SerDe を使用する場合には、大文字と小文字を区別するキー名が使用できます。これを行うには、SerDe の case.insensitive プロパティを false に設定し、大文字を使うキーでマッピングを追加します。大文字と小文字を列名に使用する例は、次のようになります。

{"Username": "bob1234", "username": "bob" }

SerDe プロパティは次のように使用してください。

CREATE external TABLE casesensitive_json (user_name String,username String)
ROW FORMAT serde 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'mapping.user_name' = 'Username','case.insensitive'='false')
LOCATION 's3://awsexamplebucket';

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合