ステップ 4: Amazon S3 のデータにクエリを実行する - Amazon Redshift

ステップ 4: Amazon S3 のデータにクエリを実行する

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

Amazon S3 でデータをクエリするには
  1. MYSPECTRUM_SCHEMA.SALES テーブルの行数を取得します。

    select count(*) from myspectrum_schema.sales;
    count 
    ------
    172462
  2. Amazon S3 に大きなファクトテーブルを、Amazon Redshift に小さなディメンションテーブルを保持することがベストプラクティスとなります。「データをロードする」でサンプルデータをロードした場合は、EVENT という名前のテーブルがデータベースに作成されます。テーブルが見つからない場合は、次のコマンドを使用して EVENT テーブルを作成します。

    create table event( eventid integer not null distkey, venueid smallint not null, catid smallint not null, dateid smallint not null sortkey, eventname varchar(200), starttime timestamp);
  3. 次の COPY コマンドの IAM ロール ARN を「Step 1. Amazon Redshift 用の IAM ロールを作成する」で作成したロール ARN と置き換え、[EVENT] テーブルをロードします。オプションで、AWS リージョン us-east-1 の Amazon S3 バケットから allevents_pipe.txt のソースデータをダウンロードして表示できます。

    copy event from 's3://redshift-downloads/tickit/allevents_pipe.txt' iam_role 'arn:aws:iam::123456789012:role/myspectrum_role' delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region 'us-east-1';

    次の例では、外部 Amazon S3 テーブル MYSPECTRUM_SCHEMA.SALES をローカル Amazon Redshift テーブルである 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
  4. 前のクエリのクエリプランを表示します。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 myspectrum_schema.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)