JSON SerDe ライブラリ - Amazon Athena

JSON SerDe ライブラリ

Athena では、JSON データをデシリアライズするために 2 つの SerDe ライブラリを使用することができます。逆シリアル化では、JSON データを変換し、Parquet や ORC のような別の形式にシリアル化 (書き出し) できるようにします。

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 では、map または struct キー名に重複するキーを使用できません。

次の DDL ステートメントの例では、Hive JSON SerDe を使用して、サンプルオンライン広告データに基づいてテーブルを作成します。LOCATION 句で、s3://myregion.elasticmapreduce/samples/hive-ads/tables/impressionsmyregion を、Athena を実行するリージョンの識別子 (s3://us-west-2.elasticmapreduce/samples/hive-ads/tables/impressions など) に置き換えます。

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';

Hive JSON SerDeでのタイムスタンプ形式の指定

文字列からタイムスタンプ値を解析するには、SERDEPROPERTIEStimestamp.formats のパラメータを使用して、以下の例のように、1 つ以上のタイムスタンプパターンのカンマ区切りリストを指定します。

... ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH SERDEPROPERTIES ("timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss.SSS'Z',yyyy-MM-dd'T'HH:mm:ss") ...

詳細については、Apache Hive ドキュメントの「タイムスタンプ」を参照してください。

クエリのためのテーブルのロード

テーブルを作成したら、MSCK REPAIR TABLE を実行してテーブルをロードし、Athena からクエリできるようにします。

MSCK REPAIR TABLE impressions

OpenX JSON SerDe

テーブル内の列の paths プロパティに加えて、OpenX JSON SerDe には、データの不整合性に対応するために便利な以下のオプションのプロパティがあります。

ignore.malformed.json

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

dots.in.keys

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

case.insensitive

オプション。デフォルト: TRUETRUE に設定すると、SerDe はすべての大文字の列を小文字に変換します。

データで大文字と小文字を区別するキー名を使用するには、WITH SERDEPROPERTIES ("case.insensitive"= FALSE;) を使用します。次に、まだすべてが小文字になっていないすべてのキーに、次の構文を使用して列名からプロパティ名へのマッピングを指定します。

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")

URLUrl のように小文字である 2 つのキーがある場合は、次のようなエラーが発生する可能性があります。

HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key "url"

これを解決するには、次の例のように、case.insensitive プロパティを FALSE に設定し、キーを異なる名前にマッピングします。

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
マッピングを

オプション。列名を、列名と同一ではない JSON キーにマップします。mapping パラメータは、JSON データにキーワードのキーが含まれている場合に便利です。たとえば、timestamp という名前の JSON キーがある場合、次の構文を使用して、キーを ts という名前の列にマッピングします。

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.ts"= "timestamp")

Hive JSON SerDe と同様に、OpenX JSON SerDe では、map または struct キー名の重複キーは許可されません。

次の DDL ステートメントの例では、OpenX JSON SerDe を使用して、Hive JSON SerDe の例で使用したのと同じサンプルオンライン広告データに基づいてテーブルを作成します。LOCATION 句で、myregion を Athena が実行されるリージョンの識別子に置き換えます。

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 の逆シリアル化

JSON SerDe を使用して、より複雑な JSON エンコードされたデータを解析できます。このためには、ネストされた構造を表すために CREATE TABLE 要素と struct 要素を使用する array ステートメントを使用する必要があります。

以下の例は、ネストされた構造を持つ JSON データから Athena テーブルを作成します。JSON でエンコードされたデータを Athena で解析するには、各 JSON ドキュメントが改行で区切られた独自の行にあることを確認します。

この例で、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-JsonSerDestruct および array コレクションデータ型とともに使用して、オブジェクトのグループを構築します。各 JSON ドキュメントは個別の行にリストされ、新しい行で区切られます。エラーを回避するため、クエリ中のデータには、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/';

その他のリソース

Athena での JSON およびネストされた JSON の使用の詳細については、以下のリソースを参照してください。