Amazon Athena
ユーザーガイド

JSON データ読み取りのベストプラクティス

JavaScript Object Notation (JSON) は、データ構造をテキストとしてエンコードするための一般的な方法です。多くのアプリケーションやツールは、JSON エンコード形式のデータを出力します。

Amazon Athena では、外部データからテーブルを作成し、このテーブルに JSON エンコード形式のデータを格納できます。この種のソースデータに対しては、Athena と合わせて JSON SerDe ライブラリを使用します。

JSON でエンコードされたデータを読み取るために以下のヒントを使用してください。

  • 適切な SerDe、ネイティブ JSON SerDe、org.apache.hive.hcatalog.data.JsonSerDe、または OpenX SerDe、org.openx.data.jsonserde.JsonSerDe を選択します。詳細については、「JSON SerDe ライブラリ」を参照してください。

  • 各 JSON エンコード方式のレコードが個別の行に入力されていることを確認します。

  • JSON でエンコードされたデータを、大文字と小文字が区別されない列内に生成します。

  • 例に示すように、誤った形式のレコードを無視するオプションを指定します。

    CREATE EXTERNAL TABLE json_table ( column_a string column_b int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true') LOCATION 's3://bucket/path/';
  • スキーマが未定義であるソースデータのフィールドを、Athena で JSON 形式でエンコードされた文字列に変換します。

Athena は、JSON データに基づくテーブルを作成するときに、既存および定義済みのスキーマに基づいてデータを解析します。ただし、スキーマが未定義のデータもあり得ます。このような場合、スキーマ管理を簡素化するには、スキーマが未定義であるソースデータのフィールドを Athena で JSON 文字列に変換し、JSON SerDe ライブラリを使用できます。

たとえば、さまざまなセンサーからのイベントを一般的なフィールドで発行する IoT アプリケーションについて考えます。これらのフィールドの 1 つに、イベントを送信するセンサー独自のカスタムペイロードを保存する必要があるとします。この場合、スキーマがわからないため、情報を JSON エンコード形式の文字列として保存することをお勧めします。これを行うには、次の例に示すように、Athena テーブル内のデータを JSON に変換します。JSON エンコード形式のデータを Athena のデータ型に変換することもできます。

Athena のデータ型を JSON に変換する

Athena のデータ型を JSON に変換するには、CAST を使用します。

WITH dataset AS ( SELECT CAST('HELLO ATHENA' AS JSON) AS hello_msg, CAST(12345 AS JSON) AS some_int, CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map ) SELECT * FROM dataset

このクエリは以下を返します。

+-------------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------------+ | "HELLO ATHENA" | 12345 | {"a":1,"b":2} | +-------------------------------------------+

JSON を Athena のデータ型に変換する

JSON データを Athena のデータ型に変換するには、CAST を使用します。

注記

次の例では、文字列を JSON エンコード形式にするために、JSON キーワードで開始し、文字列を単一引用符で囲んでいます (例: JSON '12345')。

WITH dataset AS ( SELECT CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg, CAST(JSON '12345' AS INTEGER) AS some_int, CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map ) SELECT * FROM dataset

このクエリは以下を返します。

+-------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------+ | HELLO ATHENA | 12345 | {a:1,b:2} | +-------------------------------------+