Hive JSON SerDe - Amazon Athena

Hive JSON SerDe

Hive JSON SerDe は通常、イベントなどの JSON データを処理するために使用されます。これらのイベントは、改行で区切られ JSON 形式でエンコードされたテキストの 1 行の文字列として表現されます。Hive JSON SerDe では、map または struct キー名に重複するキーを使用できません。

注記

SerDe では、各 JSON ドキュメントが、レコード内のフィールドを区切る行終端文字なしの、1 行のテキストに収まっていることを想定しています。JSON テキストがプリティプリント形式の場合、テーブルを作成した後にクエリを実行しようとすると、以下のようなエラーメッセージが表示される場合があります。「HIVE_CURSOR_ERROR: Row is not a valid JSON Object」、または「HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT」。詳細については、GitHub の OpenX SerDe のドキュメントで「JSON Data Files」(JSON データファイル) を参照してください。

次の 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' LOCATION 's3://myregion.elasticmapreduce/samples/hive-ads/tables/impressions';

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

文字列からタイムスタンプ値を解析するには、WITH SERDEPROPERTIES サブフィールドを ROW FORMAT SERDE 句に追加し、これを使用して、timestamp.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