で Athena を使用する場合のベストプラクティス AWS Glue - Amazon Athena

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

で Athena を使用する場合のベストプラクティス AWS Glue

で Athena を使用する場合 AWS Glue Data Catalog、 AWS Glue を使用して Athena でクエリするデータベースとテーブル (スキーマ) を作成するか、Athena を使用してスキーマを作成し、 AWS Glue および関連サービスで使用できます。このトピックでは、各方法を使用する際の考慮事項とベストプラクティスを示します。

Athena はその内部で、DML ステートメントの処理に Trino を使用し、スキーマを作成および変更する DDL ステートメントの処理には Hive を使用します。これらのテクノロジーでは、Athena と が連携してうまく AWS Glue 機能するように、いくつかの規則に従う必要があります。

このトピックの内容

データベース、テーブル、および列の名前

でスキーマを作成して Athena で AWS Glue クエリを実行する場合は、次の点を考慮してください。

  • データベース名は 255 文字以内とします。

  • テーブル名は 255 文字以内とします。

  • 列名は 255 文字以内とします。

  • データベース、テーブル、および列の名前には、小文字、数字、アンダースコア文字のみを使用できます。

詳細については、「AWS Glue デベロッパーガイド」の「Databases」(データベース) ならびに「Tables」(テーブル) を参照してください。

注記

AWS::Glue::Database AWS CloudFormation テンプレートを使用して AWS Glue データベースを作成し、データベース名を指定しない場合、 は、Athena と互換性のない resource_name–random_string 形式でデータベース名 AWS Glue を自動的に生成します。

AWS Glue Catalog Manager を使用して列の名前を変更できますが、テーブル名やデータベース名は変更できません。この制限を回避するには、古いデータベースの定義を使用して、新しい名前のデータベースを作成する必要があります。次に、古いデータベースのテーブルの定義を使用して、新しいデータベースにテーブルを再度作成します。これを行うには、 AWS CLI または AWS Glue SDK を使用します。この手順については、「AWS CLI を使用して AWS Glue データベースとそのテーブルを再度作成する」を参照してください。

AWS Glue クローラーの使用

AWS Glue クローラは、データセットのスキーマを検出し、 AWS Glue Data Catalog にテーブルとして登録するのに役立ちます。クローラは、データを参照しスキーマの判定を行います。さらに、パーティションを検出して登録することもできます。詳細については、「AWS Glue デベロッパーガイド」の「クローラの定義」を参照してください。正常にクロールされたデータのテーブルは Athena からクエリできます。

注記

Athena は、 AWS Glue クローラーに指定した除外パターンを認識しません。例えば、.csv.json ファイルの両方が含まれる Amazon S3 バケットがある場合、.json ファイルをクローラから除外しても、Athena は両方のファイルのグループをクエリします。これを回避するには、除外するファイルを別の場所に配置します。

AWS Glue Data Catalog と Amazon S3 を同期させるためのクローラのスケジュール設定

AWS Glue クローラは、スケジュールに従って実行するように設定することも、オンデマンドで実行するように設定することもできます。詳細については、「AWS Glue デベロッパーガイド」の「ジョブとクローラの時間ベースのスケジュール」を参照してください。

パーティション分割されたテーブルに対して一定の時刻に到着するデータがある場合は、スケジュールに従って を実行するように AWS Glue クローラーを設定して、テーブルパーティションを検出して更新できます。これにより、時間と費用がかかる可能性がある MSCK REPAIR コマンドを実行したり、ALTER TABLE ADD PARTITION コマンドの手動で実行したりする必要がなくなります。詳細については、「AWS Glue デベロッパーガイド」の「テーブルパーティション」を参照してください。

クローラでの複数のデータソースの使用

AWS Glue クローラーは Amazon S3 をスキャンして複数のディレクトリを検出すると、ヒューリスティックを使用して、テーブルのルートがディレクトリ構造内のどこにあり、どのディレクトリがテーブルのパーティションであるかを判断します。複数のディレクトリで同様のスキーマが検出されると、クローラは、これらを個別のテーブルではなくパーティションとみなす場合があります。クローラで個別のテーブルを検出しやすくするには、1 つの方法として各テーブルのルートディレクトリをクローラのデータストアとして追加します。

以下の Amazon S3 のパーティションは、その一例です。

s3://bucket01/folder1/table1/partition1/file.txt s3://bucket01/folder1/table1/partition2/file.txt s3://bucket01/folder1/table1/partition3/file.txt s3://bucket01/folder1/table2/partition4/file.txt s3://bucket01/folder1/table2/partition5/file.txt

table1 と のスキーマtable2が似ていて、 s3://bucket01/folder1/で 1 つのデータソースが に設定されている場合 AWS Glue、クローラーは 2 つのパーティション列を持つ 1 つのテーブルを作成できます。1 つは table1と を含むパーティション列table2、もう 1 つは partition1から を含むパーティション列ですpartition5

AWS Glue クローラーで 2 つの個別のテーブルを作成するには、次の手順に示すようにs3://bucket01/folder1/table2s3://bucket01/folder1/table1/と の 2 つのデータソースを持つようにクローラーを設定します。

で S3 データストアを既存のクローラーに追加するには AWS Glue

  1. にサインイン AWS Management Console し、https://console.aws.amazon.com/glue/ で AWS Glue コンソールを開きます。

  2. ナビゲーションペインで、[Crawlers (クローラ) ] を選択します。

  3. クローラーへのリンクを選択してから、[編集] を選択します。

  4. [ステップ 2: データソースと分類子を選択する] で、[編集] を選択します。

  5. [Data sources] (データソース) で、[Add a data source] (データソースを追加) を選択します。

  6. [Add data source] (データソースの追加) ダイアログボックスの [S3 path] (S3 パス) で、[Browse] (ブラウズ) を選択します。

  7. 使用したいバケットを選択し、[Choose] (選択) を選択します。

    追加したデータソースは、[Data sources ] (データソース) リストに表示されます。

  8. [次へ] を選択します。

  9. [Configure security settings] (セキュリティ設定の構成) ページで、クローラーの IAM ロールを選択してから、[Next] (次へ) を選択します。

  10. S3 パスの末尾がスラッシュで終わっていることを確認し、[Add an S3 data source] (S3 データソースの追加) を選択します。

  11. [Set output and scheduling] (出力とスケジュールの設定) ページの、[Output configuration] (出力の設定) で、ターゲットデータベースを選択します。

  12. [次へ] を選択します。

  13. [Review and update] (確認と更新) ページで、選択した内容を確認します。ステップを編集するには、[Edit] (編集) を選択します。

  14. [更新] を選択します。

"HIVE_PARTITION_SCHEMA_MISMATCH" を避けるためのパーティションスキーマの同期

パーティション列がある AWS Glue Data Catalog 内の各テーブルについて、スキーマはテーブルレベルで、テーブル内の個々のパーティションごとに保存されます。パーティションのスキーマは、パーティション内で読み取るデータのサンプルに基づいて AWS Glue クローラによって入力されます。詳細については、「クローラでの複数のデータソースの使用」を参照してください。

Athena がクエリを実行するときは、テーブルのスキーマと、クエリに必要なパーティションのスキーマを検証します。この検証では、列のデータ型を順に比較し、重複する列のデータ型が一致することを確認します。これにより、テーブルの中間で列が追加/削除されるなどの予期しないオペレーションが防止されます。パーティションのスキーマがテーブルのスキーマと異なることを Athena が検知した場合、Athena はクエリを処理できない可能性があり、HIVE_PARTITION_SCHEMA_MISMATCH で失敗します。

この問題を解決するいくつかの方法があります。まず、データを誤って追加した場合は、スキーマの差異を生じたデータファイルを削除し、パーティションを削除して、データを最クロールできます。2 つ目は、個々のパーティションをドロップしてから Athena で MSCK REPAIR を実行して、テーブルのスキーマを使用してパーティションを再度作成することです。この 2 番目のオプションは、適用するスキーマで引き続きデータを正しく読み取れることが確かな場合にのみ使用します。

テーブルメタデータの更新

クロール後、 AWS Glue クローラーは特定のテーブルメタデータを自動的に割り当て、Apache Hive、Presto、Spark などの他の外部テクノロジーとの互換性を持たせます。時折、このクローラが割り当てるメタデータプロパティが正しくないことがあります。Athena を使用してテーブルにクエリを実行する AWS Glue 前に、 のプロパティを手動で修正してください。詳細については、「AWS Glue デベロッパーガイド」の「テーブルの詳細の表示と編集」を参照してください。

AWS Glue CSV ファイルに各データフィールドの引用符が含まれていると、 がメタデータの割り当てを間違え、 serializationLibプロパティが間違ってしまう可能性があります。詳細については、「引用符で囲まれた CSV データ」を参照してください。

CSV ファイルの使用

CSV ファイルで各列向けのデータ値が引用符で囲まれていたり、CSV ファイルに分析対象のデータではないヘッダー値が含まれていたりする場合があります。 AWS Glue を使用してこれらのファイルからスキーマを作成する場合は、このセクションのガイダンスに従ってください。

引用符で囲まれた CSV データ

以下の例にあるように、データフィールドが二重引用符で囲まれた CSV ファイルがある場合があります。

"John","Doe","123-555-1231","John said \"hello\"" "Jane","Doe","123-555-9876","Jane said \"hello\""

引用符で囲まれた値を持つ CSV ファイルから作成されたテーブルに対して Athena でクエリを実行するには、OpenCSVSerDe を使用する AWS Glue ように のテーブルプロパティを変更する必要があります。OpenCSV SerDe の詳細については、「」を参照してくださいCSV を処理するための OpenCSVSerDe

AWS Glue コンソールでテーブルプロパティを編集するには
  1. AWS Glue コンソールのナビゲーションペインで、テーブル を選択します。

  2. 編集するテーブルのリンクを選択した後、[Action] (アクション)、[Edit table] (テーブルの編集) の順に選択します。

  3. [Edit table] (テーブルを編集) ページで、以下の変更を行います。

    • [Serialization lib] (シリアル化ライブラリ) には org.apache.hadoop.hive.serde2.OpenCSVSerde を入力します。

    • [Serde parameters] (Serde パラメータ) には、escapeCharquoteChar、および separatorChar の各キーに以下の値を入力します。

      • escapeChar には、バックスラッシュ (\) を入力します。

      • quoteChar には、二重引用符 (") を入力します。

      • separatorChar には、カンマ (,) を入力します。

  4. [保存] を選択します。

詳細については、「AWS Glue デベロッパーガイド」の「テーブルの詳細の表示と編集」を参照してください。

プログラムによる AWS Glue テーブルプロパティの更新

次の JSON の例のように、 API オペレーションまたは update-table CLI コマンドを使用して AWS Glue UpdateTable、テーブル定義の SerDeInfoブロックを変更できます。

"SerDeInfo": { "name": "", "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde", "parameters": { "separatorChar": "," "quoteChar": "\"" "escapeChar": "\\" } },

ヘッダー付きの CSV ファイル

CREATE TABLE ステートメントを使用して Athena でテーブルを定義するときは、以下の例にあるように、skip.header.line.count テーブルプロパティを使用して CSV データ内のヘッダーを無視することができます。

... STORED AS TEXTFILE LOCATION 's3://my_bucket/csvdata_folder/'; TBLPROPERTIES ("skip.header.line.count"="1")

または、CSV のヘッダーを事前に削除して、ヘッダー情報が Athena のクエリ結果に含まれないようにすることもできます。これを実現する 1 つの方法は、抽出、変換、ロード (ETL) 作業を実行する AWS Glue ジョブを使用することです。Python ダイアレクトの拡張言語 AWS Glue を使用して、 でスクリプトを PySpark記述できます。詳細については、「 AWS Glue デベロッパーガイド」の「 AWS Glue でのジョブの作成」を参照してください。

次の例は、 を使用して動的フレームを記述しfrom_optionswriteHeader形式オプションを false に設定する AWS Glue スクリプト内の関数を示しています。これにより、ヘッダー情報が削除されます。

glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://MYBUCKET/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")

AWS Glue パーティションインデックス作成とフィルタリング

Athena は、パーティション分割されたテーブルに対しクエリを実行する際、クエリに関連するサブセットに使用可能なテーブルパーティションの取得とフィルタリングを行います。新しいデータとパーティションが追加されると、パーティションの処理に時間がかかり、クエリの実行時間が長くなる可能性があります。時間の経過とともに多数のテーブルが増加するパーティションの場合は、 AWS Glue パーティションのインデックス作成とフィルタリングを使用することを検討してください。パーティションのインデックス作成により、Athena によるパーティション処理が最適化され、高度にパーティション化されたテーブルでのクエリパフォーマンスを向上させることができます。テーブルのプロパティでのパーティションフィルタリングの設定は、以下 2 つのステップで行います。

  1. AWS Glueでのパーティションインデックスの作成。

  2. テーブルのパーティションフィルタリングの有効化。

パーティションインデックスの作成

でパーティションインデックスを作成する手順については AWS Glue、「 AWS Glue デベロッパーガイド」の「パーティションインデックスの使用」を参照してください。のパーティションインデックスの制限については AWS Glue、そのページの「パーティションインデックスについて」セクションを参照してください。

パーティションフィルタリングの有効化

テーブルのパーティションフィルタリングを有効にするには、 AWS Glueで新しくテーブルのプロパティを設定する必要があります。でテーブルプロパティを設定する手順については AWS Glue、「パーティション射影の設定」ページを参照してください。でテーブルの詳細を編集するときは AWS Glue、テーブルプロパティセクションに次のキーと値のペアを追加します。

  • [Key] (キー) に partition_filtering.enabled を追加します。

  • [Value] (値) に true を追加します。

partition_filtering.enabledfalse を設定することで、このテーブルのパーティションフィルタリングをいつでも無効にすることができます。

上記の各ステップを完了したら、Athena コンソールに戻ってデータをクエリできます。

パーティションインデックス作成とフィルタリングの使用の詳細については、 AWS Big Data Blog「Improve Amazon Athena query performance using AWS Glue Data Catalog partition indexes」を参照してください。

地理空間データの使用

AWS Glue は、Well-known Text (WKT)、Well-Known Binary (WKB)、またはその他の PostGIS データ型をネイティブにサポートしていません。 AWS Glue 分類子は地理空間データを解析し、varcharCSV の など、 形式でサポートされているデータ型を使用して分類します。他の AWS Glue テーブルと同様に、地理空間データから作成されたテーブルのプロパティを更新して、Athena がこれらのデータ型をそのまま解析できるようにする必要がある場合があります。詳細については、AWS Glue クローラーの使用およびCSV ファイルの使用を参照してください。Athena は、 AWS Glue テーブルの一部の地理空間データ型をそのまま解析できない場合があります。Athena での地理空間データの操作の詳細については、「地理空間データのクエリ」を参照してください。

Athena での ETL の AWS Glue ジョブの使用

AWS Glue ジョブは ETL オペレーションを実行します。 AWS Glue ジョブは、ソースからデータを抽出し、変換して、ターゲットにロードするスクリプトを実行します。詳細については、「 AWS Glue デベロッパーガイド」の「 AWS Glue でのジョブの作成」を参照してください。

AWS Glue ETL ジョブに Athena を使用してテーブルを作成する

Athena 内で作成するテーブルには、データの形式を識別する classification と呼ばれるテーブルプロパティが追加されている必要があります。これにより、 AWS Glue は ETL ジョブにテーブルを使用できます。分類値は avrocsvjsonorcparquet または xml です。Athena での CREATE TABLE ステートメントの例は、以下のとおりです。

CREATE EXTERNAL TABLE sampleTable ( column1 INT, column2 INT ) STORED AS PARQUET TBLPROPERTIES ( 'classification'='parquet')

テーブルの作成時にテーブルプロパティが追加されなかった場合は、 AWS Glue コンソールを使用して追加できます。

AWS Glue コンソールを使用して分類テーブルプロパティを追加するには

  1. にサインイン AWS Management Console し、https://console.aws.amazon.com/glue/ で AWS Glue コンソールを開きます。

  2. コンソールのナビゲーションペインで、[Tables] (テーブル) を選択します。

  3. 編集するテーブルのリンクを選択した後、[Action] (アクション)、[Edit table] (テーブルの編集) の順に選択します。

  4. [Table properties] (テーブルプロパティ) セクションまで、下にスクロールします。

  5. [追加] を選択します。

  6. [Key] (キー) に「classification」と入力します。

  7. [Value] (値) に、データタイプを入力します(例:json)。

  8. [保存] を選択します。

    [Table details] (テーブルの詳細) セクションで、入力したデータタイプがテーブルの [Classification] (分類) フィールドに表示されます。

詳細については、「AWS Glue デベロッパーガイド」の「テーブルの使用」を参照してください。

ETL ジョブを使用したクエリパフォーマンスの最適化

AWS Glue ジョブは、Athena でのクエリパフォーマンスを最適化する形式にデータを変換するのに役立ちます。データの形式は、Athena でのクエリパフォーマンスとクエリコストに大きな影響を及ぼします。

Parquet および ORC データ形式を使用することをお勧めします。 はこれらのデータ形式の両方への書き込み AWS Glue をサポートしているため、データを Athena に最適な形式に簡単かつ迅速に変換できます。これらの形式とパフォーマンスを向上させるその他の方法の詳細については、「Amazon Athena のパフォーマンスチューニングのヒントトップ 10」を参照してください。

ORC への変換に伴う SMALLINT データ型と TINYINT データ型の INT への変換

Athena が AWS Glue ETL ジョブによって生成された SMALLINTおよび TINYINT データ型を読み取れない可能性を減らすTINYINTには、ウィザードを使用するとき、または ETL ジョブのスクリプトを作成するINTときに、 SMALLINTおよび を に変換します。

ETL の AWS Glue ジョブの自動化

AWS Glue ETL ジョブは、トリガーに基づいて自動的に実行するように設定できます。この機能は、外部からのデータが Athena でのクエリ用に最適ではない形式で Amazon S3 バケットにプッシュ AWS されている場合に最適です。詳細については、「AWS Glue デベロッパーガイド」の「AWS Glue ジョブのトリガー」を参照してください。