AWS CloudFormation スタックを起動して Amazon S3 内のデータにクエリを実行する - Amazon Redshift

AWS CloudFormation スタックを起動して Amazon S3 内のデータにクエリを実行する

Amazon Redshift クラスターを作成してクラスターに接続したら、Redshift Spectrum DataLake の AWS CloudFormation テンプレートをインストールし、データをクエリできるようになります。

CloudFormation は、Redshift Spectrum Getting Started DataLake テンプレートをインストールし、以下を含むスタックを作成します。

  • Redshift クラスターに関連付けられている、myspectrum_roleという名前のロール

  • myspectrum_schema という名前の外部スキーマ

  • Amazon S3 バケット内の、salesという名前の外部テーブル

  • データがロードされた、eventという名前の Redshift テーブル

Redshift Spectrum Getting Started DataLake で CloudFormation スタックを起動するには
  1. [Launch CFN stack] (CFN スタックを起動する) をクリックします。DataLake.yml テンプレートが選択された状態で、CloudFormation コンソールが開きます。

    また、Redshift Spectrum Getting Started DataLake CloudFormation の CFN テンプレートをダウンロードしてカスタマイズし、CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開いて、カスタマイズしたテンプレートでスタックを作成することもできます。

  2. [Next] を選択します。

  3. [Parameters] (パラメータ)で、Amazon Redshift クラスター名、データベース名、およびデータベースのユーザー名を入力します。

  4. [Next] を選択します。

    スタックに関するオプションが表示されます。

  5. [Next] (次へ) をクリックして、デフォルト設定を受け入れます。

  6. 情報を確認し、[機能] で、[AWS CloudFormation によって IAM リソースが作成される場合があることを承認します] を選択します。

  7. [スタックの作成] を選択します。

スタックの作成中にエラーが発生した場合は、以下の情報をご確認ください。

  • エラーの解決に役立つ情報については、CloudFormation の [Events] (イベント) タブを開きます。

  • オペレーションを再試行する前に DataLake の CloudFormation スタックを削除します。

  • Amazon Redshift データベースに接続されていることを確認します。

  • Amazon Redshift クラスター名、データベース名、およびデータベースのユーザー名に関する情報を、正確に入力しているか確認します。

Amazon S3 内のデータへのクエリ

他の Amazon Redshift テーブルにクエリを実行する際に使用するものと同じ SELECT ステートメントで、外部テーブルでもクエリを実行できます。これらの SELECT ステートメントクエリには、テーブルの結合、データの集計、および述語のフィルタリングが含まれます。

次のクエリは、外部テーブル myspectrum_schema.sales 内の行数を返します。

select count(*) from myspectrum_schema.sales;
count 
------
172462

外部テーブルとローカルテーブルの結合

次の例では、外部テーブル myspectrum_schema.sales をローカルテーブルである event と結合し、トップ 10 イベントの合計セールスを検出しています。

select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
eventid | sum     
--------+---------
    289 | 51846.00
   7895 | 51049.00
   1602 | 50301.00
    851 | 49956.00
   7315 | 49823.00
   6471 | 47997.00
   2118 | 47863.00
    984 | 46780.00
   7851 | 46661.00
   5638 | 46280.00

クエリプランの表示

前のクエリのクエリプランを表示します。Amazon S3 のデータに対して実行された S3 Seq ScanS3 HashAggregate、および S3 Query Scan のステップをメモします。

explain select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
QUERY PLAN ----------------------------------------------------------------------------- XN Limit (cost=1001055770628.63..1001055770628.65 rows=10 width=31) -> XN Merge (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Merge Key: sum(sales.derived_col2) -> XN Network (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Send to leader -> XN Sort (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Sort Key: sum(sales.derived_col2) -> XN HashAggregate (cost=1055770620.49..1055770620.99 rows=200 width=31) -> XN Hash Join DS_BCAST_INNER (cost=3119.97..1055769620.49 rows=200000 width=31) Hash Cond: ("outer".derived_col1 = "inner".eventid) -> XN S3 Query Scan sales (cost=3010.00..5010.50 rows=200000 width=31) -> S3 HashAggregate (cost=3010.00..3010.50 rows=200000 width=16) -> S3 Seq Scan spectrum.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT (cost=0.00..2150.00 rows=172000 width=16) Filter: (pricepaid > 30.00) -> XN Hash (cost=87.98..87.98 rows=8798 width=4) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=4)