Amazon Redshift Spectrum에서 외부 테이블을 생성하고 쿼리하려면 어떻게 해야 합니까?

2분 분량
0

Amazon Redshift Spectrum을 사용하여 외부 테이블을 생성하고 쿼리하고 싶습니다.

해결 방법

Amazon Simple Storage Service(Amazon S3)에서 데이터를 쿼리하려면 Amazon Redshift 테이블에 데이터를 로드할 필요가 없습니다. Redshift Spectrum이 쿼리를 처리할 때 데이터는 S3 버킷에 남아 있습니다.

중요: Amazon Redshift 클러스터와 S3 버킷이 동일한 AWS 리전에 있는지 확인하십시오.

Redshift Spectrum을 사용하여 외부 테이블을 생성하려면 다음 단계를 완료하십시오.

  1. Amazon Redshift에 대한 AWS Identity and Access Management(IAM) 역할을 생성합니다.

  2. 다음 IAM 정책을 연결하여 데이터 카탈로그에 액세스하는 데 필요한 권한을 Amazon Redshift에 부여하십시오. 
    AWS Glue Data Catalog를 사용하는 경우 AmazonS3ReadOnlyAccessAWSGlueConsoleFullAccess IAM 정책을 역할에 연결하십시오.
    Amazon Athena Data Catalog를 사용하는 경우 AmazonAthenaFullAccess IAM 정책을 역할에 연결하십시오.

  3. IAM 역할을 Amazon Redshift 클러스터에 연결합니다.

  4. 외부 스키마를 생성합니다.

  5. 데이터 파일을 다운로드하여 해당 리전의 S3 버킷에 업로드합니다. 다음 예에서는 S3용 TICKIT 샘플 데이터 파일을 사용합니다.

    s3://<bucket_name>/tickit/spectrum/event/' and 's3://bucket_name/tickit/spectrum/sales/

    참고: bucket name을 S3 버킷 이름으로 바꾸십시오.

  6. 외부 테이블을 생성합니다. 다음 예제에서는 EVENT 데이터에 대한 외부 테이블을 만듭니다.

    create external table spectrum.event(
        eventid integer,
        venueid smallint,
        catid smallint,
        dateid smallint,
        eventname varchar(200),
        starttime timestamp
    )
    row format delimited
    fields terminated by '|'
    stored as textfile
    location 's3://bucket_name/tickit/spectrum/event/';

    참고: bucket name을 S3 버킷 이름으로 바꾸십시오. AWS Glue를 사용하여 외부 테이블을 생성하려면 Data Catalog에 테이블 정의를 추가해야 합니다. 
    Amazon Athena를 사용하여 외부 테이블을 생성하려면 테이블 정의를 추가하십시오.
    Athena를 사용한 테이블 정의 예제:

    CREATE EXTERNAL TABLE spectrum.event (
          eventid int,
          venueid smallint,
          catid smallint,
          dateid smallint,
          eventname varchar(max),
          starttime timestamp)
        ROW FORMAT DELIMITED
          FIELDS TERMINATED BY '|'
        STORED AS INPUTFORMAT
          'org.apache.hadoop.mapred.TextInputFormat'
        OUTPUTFORMAT
  7. 외부 스키마가 참조하는 모든 외부 테이블을 보려면 SVV_EXTERNAL_TABLES에 대해 다음 쿼리를 실행하십시오.

    select schemaname , tablename , location from svv_external_tables where schemaname = 'spectrum';
    
    schemaname | tablename | location
    ----------------+---------------------------------+-----------------------------------------------------------------------
    spectrum | event | s3://bucket-name/file-location

    참고: bucket name을 S3 버킷 이름으로, file location을 파일 위치로 바꿉니다.

  8. 외부 테이블을 외부 Redshift Spectrum 테이블로 쿼리합니다. SELECT 문을 사용하십시오.

    select top 3 spectrum.sales.eventid, sum(spectrum.sales.pricepaid) from spectrum.sales, spectrum.event
    where spectrum.sales.eventid = spectrum.event.eventid
    and spectrum.sales.pricepaid > 30
    group by spectrum.sales.eventid
    order by 2 desc;
    
     eventid |   sum
    ---------+----------
         289 | 51846.00
        7895 | 51049.00
        1602 | 50301.00

    위의 예제 쿼리는 외부 SALES 테이블을 외부 EVENT 테이블과 조인합니다.

관련 정보

Amazon Redshift Spectrum

Amazon Redshift Spectrum의 쿼리 문제 해결

AWS 공식
AWS 공식업데이트됨 한 달 전