JSON SerDe ライブラリ - Amazon Athena

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

JSON SerDe ライブラリ

Athena では、2 つの SerDe ライブラリを使用して JSON データを逆シリアル化できます。逆シリアル化では、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 SerDe を使用して、より複雑な 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 の操作の詳細については、次のリソースを参照してください。