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을 단계 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';

    다음 예는 상위 10개 이벤트의 총 매출을 찾기 위해 외부 Amazon S3 테이블 MYSPECTRUM_SCHEMA.SALES와 로컬 Amazon Redshift 테이블 EVENT를 조인합니다.

    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 Scan, S3 HashAggregateS3 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)