Amazon Athena
ユーザーガイド

JSON SerDe ライブラリ

Athena では、以下の 2 つの SerDe ライブラリを使用して JSON のデータを処理できます。

SerDe 名

Hive-JsonSerDe

Openx-JsonSerDe

ライブラリ名

以下のいずれかを使用します。

org.apache.hive.hcatalog.data.JsonSerDe

org.openx.data.jsonserde.JsonSerDe

Hive JSON SerDe

Hive JSON SerDe では、JSON データを代表的なイベントとして処理します。これらのイベントは、改行で区切られた JSON エンコード形式のテキストブロックとして表現されます。

Hive JSON SerDe では、より複雑なネスト構造の JSON エンコード形式のデータを解析することもできます。ただし、これには複雑なデータ型に対応する DDL が必要です。「例 : ネスト JSON の逆シリアル化」を参照してください。

この SerDe では、重複するキーは map (または struct) では許可されていません。

注記

Athena を実行するリージョン以外のリージョンのデータをクエリすることができます。Athena の標準料金に加えて、Amazon S3 の標準のリージョン間データ転送料金が適用されます。データ転送料金を削減するには、s3://athena-examples-myregion/path/to/data/myregion を、たとえば、s3://athena-examples-us-east-1/path/to/data/ のように Athena を実行するリージョン識別子に置き換えます。

次の DDL ステートメントでは Hive JSON SerDe を使用しています。

CREATE EXTERNAL TABLE impressions ( requestbegintime string, adid string, impressionid string, referrer string, useragent string, usercookie string, ip string, number string, processid string, browsercookie string, requestendtime string, timers struct < modellookup:string, requesttime:string >, threadid string, hostname string, sessionid string ) PARTITIONED BY (dt string) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' with serdeproperties ( 'paths'='requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip' ) LOCATION 's3://myregion.elasticmapreduce/samples/hive-ads/tables/impressions';

OpenX JSON SerDe

OpenX SerDe はデータをデシリアライズするために Athena で使用されます。つまり、Parquet または ORC 形式へのシリアル化に備えて、データを JSON 形式から変換します。これは、どちらが必要な機能を提供しているかに応じて選択できる 2 つのデシリアライザーのうちの 1 つです。もう 1 つのオプションは、Hive JsonSerDe です。

この SerDe には、Athena でテーブルを作成するときに指定できる便利なプロパティがいくつかあります。これを使用すると、データの不整合に対処できます。

ignore.malformed.json

オプション。TRUE に設定すると、不正な形式の JSON 構文を無視できます。デフォルト: FALSE

ConvertDotsInJsonKeysToUnderscores

オプション。デフォルト: FALSETRUE に設定すると、SerDe はキー名のドットをアンダースコアに置き換えることができます。たとえば、JSON データセットに "a.b" という名前のキーが含まれている場合は、このプロパティを使用して列名を Athena の "a_b" に定義できます。デフォルトでは (この SerDe がないと)、Athena は列名にドットを許可しません。

case.insensitive

オプション。デフォルトでは、Athena は JSON データセットのすべてのキーで小文字を使用する必要があります。デフォルト: TRUETRUE に設定すると、SerDe はすべての大文字の列を小文字に変換します。WITH SERDE PROPERTIES ("case.insensitive"= FALSE;) を使用すると、データ内で大文字と小文字を区別してキー名を使用できます。

ColumnToJsonKeyMappings

オプション。列名を、列名と同一ではない JSON キーにマップします。これは、JSON データにキーワードのキーが含まれている場合に便利です。たとえば、timestamp という名前の JSON キーがある場合、このキーを ts という名前の列にマップするには、このパラメータを {"ts": "timestamp"} に設定します。このパラメータは文字列型の値を取ります。これには次のキーパターン ^\S+$ および次の値パターン ^(?!\s*$).+ を使用します。

この SerDe では、重複するキーは map (または struct) では許可されていません。

次の DDL ステートメントでは OpenX JSON SerDe を使用しています。

CREATE EXTERNAL TABLE impressions ( requestbegintime string, adid string, impressionId string, referrer string, useragent string, usercookie string, ip string, number string, processid string, browsercokie string, requestendtime string, timers struct< modellookup:string, requesttime:string>, threadid string, hostname string, sessionid string ) PARTITIONED BY (dt string) ROW FORMAT serde 'org.openx.data.jsonserde.JsonSerDe' with serdeproperties ( 'paths'='requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip' ) LOCATION 's3://myregion.elasticmapreduce/samples/hive-ads/tables/impressions';

例 : ネスト JSON の逆シリアル化

Athena でテーブルを作成するときに、JSON データの逆シリアル化が問題になることがあります。

複雑なネスト JSON の処理に伴う一般的な問題と言えます。これらの問題とトラブルシューティング対策の詳細については、AWS Knowledge Center の記事「Amazon Athena で JSON データを読み取ろうとするとエラーになる」を参照してください。

一般的なシナリオの詳細とクエリのヒントについては、「Amazon Athena で JSONSerDe を使用してネスト JSON とマッピングからテーブルを作成する」を参照してください。

次の例では、JSON のネスト構造のデータから Athena テーブルを作成するシンプルな方法を示します。Athena で JSON エンコード形式のデータを解析するには、各 JSON ドキュメントが 1 行で入力され、新しい行で区切られている必要があります。

この例で、JSON エンコード形式のデータの構造は次のとおりとします。

{ "DocId": "AWS", "User": { "Id": 1234, "Username": "bob1234", "Name": "Bob", "ShippingAddress": { "Address1": "123 Main St.", "Address2": null, "City": "Seattle", "State": "WA" }, "Orders": [ { "ItemId": 6789, "OrderDate": "11/11/2017" }, { "ItemId": 4352, "OrderDate": "12/12/2017" } ] } }

次の CREATE TABLE コマンドでは、Openx-JsonSerDestructarray などのコレクションデータ型を使用してオブジェクトのグループを構築します。各 JSON ドキュメントは個別の行にリストされ、新しい行で区切られます。エラーを回避するため、クエリ中のデータには、struct およびマップキー名の重複するキーは含まれません。重複するキーは、マップ (または struct) のキー名では許可されていません。

CREATE external TABLE complex_json ( docid string, `user` struct< id:INT, username:string, name:string, shippingaddress:struct< address1:string, address2:string, city:string, state:string >, orders:array< struct< itemid:INT, orderdate:string > > > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://mybucket/myjsondata/';