JSON SerDe ライブラリ - Amazon Athena

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

JSON SerDe ライブラリ

では、2 つの Athena ライブラリを使用して JSON データを逆シリアル化できます。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 を置き換えます。myregion を実行するリージョン識別子 (例: s3://myregion.elasticmapreduce/samples/hive-ads/tables/impressions) のある 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';

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

MSCK REPAIR TABLE impressions

OpenX JSON SerDe

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

ignore.malformed.json

省略可能。TRUE に設定すると、不正な形式の JSON 構文を無視できます。デフォルト: FALSE

dots.in.keys

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

case.insensitive

省略可能。デフォルトは TRUE です。 に設定すると、TRUE はすべての大文字の列を小文字に変換します。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 SerDes を使用して、より複雑な JSON エンコードされたデータを解析できます。このためには、ネストされた構造を表すために struct 要素と array 要素を使用する CREATE TABLE ステートメントを使用する必要があります。

次の例では、ネストされた構造を持つ JSON データから Athena テーブルを作成します。Athena で JSON エンコードされたデータを解析するには、各 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 の操作の詳細については、次のリソースを参照してください。