Redshift Spectrum용 외부 테이블 생성 - Amazon Redshift

Redshift Spectrum용 외부 테이블 생성

외부 스키마에서 외부 테이블을 생성합니다. 외부 테이블을 생성하려면 외부 스키마의 소유자이거나 수퍼유저여야 합니다. 외부 스키마의 소유권을 이전하려면 ALTER SCHEMA를 사용해 소유자를 변경합니다. 다음 예에서는spectrum_schema 스키마의 소유자를 newowner로 바꿉니다.

alter schema spectrum_schema owner to newowner;

Redshift Spectrum 쿼리를 실행하는 데 필요한 권한은 다음과 같습니다.

  • 스키마에 대한 사용 권한

  • 현재 데이터베이스에서 임시 테이블을 생성할 수 있는 권한

다음 예에서는 spectrum_schema 스키마에 대한 사용 권한을 spectrumusers 사용자 그룹에 부여합니다.

grant usage on schema spectrum_schema to group spectrumusers;

다음 예에서는 spectrumdb 데이터베이스에 대한 임시 권한을 spectrumusers 사용자 그룹에 부여합니다.

grant temp on database spectrumdb to group spectrumusers;

외부 테이블은 Amazon Redshift, AWS Glue, Amazon Athena 또는 Apache Hive 메타스토어에서 생성할 수 있습니다. 자세한 내용은 AWS Glue Developer GuideGetting Started Using AWS Glue, Amazon Athena User GuideGetting Started 또는 Amazon EMR Developer GuideApache Hive 섹션을 참조하세요.

외부 테이블이 AWS Glue, Athena 또는 Hive 메타스토어에서 정의된 경우 먼저 외부 데이터베이스를 참조하는 외부 스키마를 생성합니다. 그러면 Amazon Redshift에서 테이블을 생성할 필요 없이 테이블 이름에 스키마 이름을 접두사로 사용하여 SELECT 문에서 외부 테이블을 참조할 수 있습니다. 자세한 내용은 Amazon Redshift Spectrum용 외부 스키마 생성 단원을 참조하십시오.

Amazon Redshift가 AWS Glue Data Catalog의 테이블을 볼 수 있도록 하려면 Amazon Redshift IAM 역할에 glue:GetTable을 추가합니다. 그렇지 않은 경우 다음과 같은 오류가 발생할 수 있습니다.

RedshiftIamRoleSession is not authorized to perform: glue:GetTable on resource: *;

예를 들어 Athena 외부 카탈로그에서 정의된 lineitem_athena라는 외부 테이블이 있다고 가정해 봅시다. 이 경우, 이름이 athena_schema인 외부 테이블을 정의한 후 다음 SELECT 문을 사용해 테이블을 쿼리할 수 있습니다.

select count(*) from athena_schema.lineitem_athena;

Amazon Redshift에서 외부 테이블을 정의하려면 CREATE EXTERNAL TABLE 명령을 사용합니다. 외부 테이블 문은 테이블 열, 데이터 파일 형식, Amazon S3에서의 데이터 위치를 정의합니다. Redshift Spectrum은 지정된 폴더에 있는 파일과 하위 폴더를 모두 스캔합니다. Redshift Spectrum은 숨겨진 파일과 마침표, 밑줄 또는 해시 표시( . , _, 또는 #)로 시작하거나 물결표(~)로 끝나는 파일은 무시합니다.

다음 예에서는 spectrum이라는 Amazon Redshift 외부 스키마에서 SALES로 명명된 테이블을 생성합니다. 데이터는 탭으로 구분된 텍스트 파일입니다.

create external table spectrum.sales( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) row format delimited fields terminated by '\t' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales/' table properties ('numRows'='172000');

외부 테이블을 보려면 SVV_EXTERNAL_TABLES 시스템 뷰를 쿼리하십시오.

가상 열

기본적으로 Amazon Redshift에서는 가상 열 $path, $size$spectrum_oid가 있는 외부 테이블을 생성합니다. $path 열을 선택하면 Amazon S3에 있는 데이터 파일 경로를 확인하고 $size 열을 선택하여 쿼리에서 반환한 각 행에 대한 데이터 파일의 크기를 확인할 수 있습니다. $spectrum_oid 열은 Redshift Spectrum으로 상관 쿼리를 수행하는 기능을 제공합니다. 예시는 예: Redshift Spectrum에서 상관 하위 쿼리 수행 섹션을 참조하세요. $path, $size$spectrum_oid 열 이름은 큰따옴표로 구분해야 합니다. SELECT * 절은 가상 열을 반환하지 않습니다. 다음 예와 같이 쿼리에 $path, $size$spectrum_oid 열 이름을 명시적으로 포함해야 합니다.

select "$path", "$size", "$spectrum_oid" from spectrum.sales_part where saledate = '2008-12-01';

spectrum_enable_pseudo_columns 구성 파라미터를 false로 설정하여 세션에 대해 가상 열 생성을 비활성화할 수 있습니다. 자세한 내용은 spectrum_enable_pseudo_columns 단원을 참조하십시오. enable_spectrum_oidfalse로 설정하여 $spectrum_oid 가상 열만 비활성화할 수도 있습니다. 자세한 내용은 enable_spectrum_oid 단원을 참조하십시오. 그러나 $spectrum_oid 가상 열을 비활성화하면 Redshift Spectrum과의 상관 쿼리에 대한 지원도 비활성화됩니다.

중요

$size, $path 또는 $spectrum_oid를 선택하면 Redshift Spectrum이 Amazon S3의 데이터 파일을 스캔해 결과 집합의 크기를 결정하기 때문에 요금이 발생합니다. 자세한 내용은 Amazon Redshift 요금 섹션을 참조하세요.

가상 열 예제

다음은 외부 테이블의 관련 데이터 파일의 총 크기를 반환하는 예입니다.

select distinct "$path", "$size" from spectrum.sales_part; $path | $size --------------------------------------------------------------------------+------- s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/ | 1616 s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ | 1444 s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/ | 1644

Redshift Spectrum 외부 테이블 파티셔닝

데이터를 파티셔닝할 때 파티션 키를 기준으로 필터링하여 Redshift가 스캔하는 데이터 양을 제한할 수 있습니다. 어떤 키를 기준으로도 데이터를 분할할 수 있습니다.

일반적인 관행은 시간을 기준으로 데이터를 파티셔닝하는 것입니다. 예를 들어 연, 월, 일, 시를 기준으로 파티셔닝할 수 있습니다. 데이터가 여러 원본에서 오는 경우, 데이터 원본 식별자와 날짜를 기준으로 파티셔닝할 수 있습니다.

다음 절차에서는 데이터를 파티셔닝하는 방법에 대해 설명합니다.

데이터를 파티셔닝하려면
  1. 파티션 키에 따라 Amazon S3의 폴더에 데이터를 저장합니다.

    파티션 값마다 폴더를 하나씩 만들고 파티션 키와 값을 사용하여 폴더 이름을 지정합니다. 예를 들어 날짜를 기준으로 파티셔닝하는 경우, 폴더의 이름은 saledate=2017-04-01, saledate=2017-04-02 등이 될 수 있습니다. Redshift Spectrum은 파티션 폴더에 있는 파일과 하위 폴더를 모두 스캔합니다. Redshift Spectrum은 숨겨진 파일과 마침표, 밑줄 또는 해시 표시( . , _, 또는 #)로 시작하거나 물결표(~)로 끝나는 파일은 무시합니다.

  2. 외부 테이블을 만들고 PARTITIONED BY 절에서 파티션 키를 지정합니다.

    파티션 키가 테이블 열의 이름이어서는 안 됩니다. 데이터 형식은 SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE 또는 TIMESTAMP 데이터 형식일 수 있습니다.

  3. 파티션을 추가합니다.

    ALTER TABLE … ADD PARTITION을 사용하여 각 파티션을 추가하고 파티션 열 및 키 값과 Amazon S3에서의 파티션 폴더 위치를 지정합니다. 단일 ALTER TABLE … ADD 문을 사용하여 여러 파티션을 추가할 수 있습니다. 다음 예는 '2008-01''2008-03'에 대한 파티션을 추가합니다.

    alter table spectrum.sales_part add partition(saledate='2008-01-01') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/' partition(saledate='2008-03-01') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
    참고

    AWS Glue 카탈로그를 사용하는 경우 단일 ALTER TABLE 문을 사용하여 파티션을 최대 100개까지 추가할 수 있습니다.

데이터 파티셔닝 예제

이 예에서는 하나의 파티션 키로 분할된 외부 테이블 하나와 두 개의 파티션 키로 분할된 외부 테이블 하나를 생성합니다.

이 예의 샘플 데이터는 인증된 모든 AWS 사용자에게 읽기 권한을 부여하는 Amazon S3 버킷에 위치합니다. 클러스터와 외부 데이터 파일은 같은 AWS 리전에 있어야 합니다. 샘플 데이터 버킷은 미국 동부(버지니아 북부) 리전(us-east-1)에 있습니다. Redshift Spectrum을 사용하여 데이터에 액세스하려면 클러스터도 us-east-1에 있어야 합니다. Amazon S3에서 폴더를 나열하려면 다음 명령을 실행합니다.

aws s3 ls s3://redshift-downloads/tickit/spectrum/sales_partition/
PRE saledate=2008-01/
PRE saledate=2008-03/
PRE saledate=2008-04/
PRE saledate=2008-05/
PRE saledate=2008-06/
PRE saledate=2008-12/

아직 외부 스키마가 없는 경우에는 다음 명령을 실행합니다. AWS Identity and Access Management(IAM) 역할의 Amazon 리소스 이름(ARN)을 대체합니다.

create external schema spectrum from data catalog database 'spectrumdb' iam_role 'arn:aws:iam::123456789012:role/myspectrumrole' create external database if not exists;

예 1: 단일 파티션 키로 분할

이 다음 예에서는 월 기준으로 분할된 외부 테이블을 만듭니다.

월 기준으로 분할된 외부 테이블을 만들려면 다음 명령을 실행합니다.

create external table spectrum.sales_part( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) partitioned by (saledate char(10)) row format delimited fields terminated by '|' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales_partition/' table properties ('numRows'='172000');

파티션을 추가하려면 다음 ALTER TABLE 명령을 실행합니다.

alter table spectrum.sales_part add partition(saledate='2008-01') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/' partition(saledate='2008-03') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/' partition(saledate='2008-04') location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04/';

파티셔닝된 테이블에서 데이터를 선택하려면 다음 쿼리를 실행합니다.

select top 5 spectrum.sales_part.eventid, sum(spectrum.sales_part.pricepaid) from spectrum.sales_part, event where spectrum.sales_part.eventid = event.eventid and spectrum.sales_part.pricepaid > 30 and saledate = '2008-01' group by spectrum.sales_part.eventid order by 2 desc;
eventid | sum     
--------+---------
   4124 | 21179.00
   1924 | 20569.00
   2294 | 18830.00
   2260 | 17669.00
   6032 | 17265.00

외부 테이블 파티션을 보려면 SVV_EXTERNAL_PARTITIONS 시스템 뷰를 쿼리하십시오.

select schemaname, tablename, values, location from svv_external_partitions where tablename = 'sales_part';
schemaname | tablename  | values      | location                                                                
-----------+------------+-------------+-------------------------------------------------------------------------
spectrum   | sales_part | ["2008-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-03"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04

예 2: 여러 파티션 키로 분할

dateeventid로 분할된 외부 테이블을 만들려면 다음 명령을 실행합니다.

create external table spectrum.sales_event( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) partitioned by (salesmonth char(10), event integer) row format delimited fields terminated by '|' stored as textfile location 's3://redshift-downloads/tickit/spectrum/salesevent/' table properties ('numRows'='172000');

파티션을 추가하려면 다음 ALTER TABLE 명령을 실행합니다.

alter table spectrum.sales_event add partition(salesmonth='2008-01', event='101') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=101/' partition(salesmonth='2008-01', event='102') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=102/' partition(salesmonth='2008-01', event='103') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-01/event=103/' partition(salesmonth='2008-02', event='101') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=101/' partition(salesmonth='2008-02', event='102') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=102/' partition(salesmonth='2008-02', event='103') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-02/event=103/' partition(salesmonth='2008-03', event='101') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=101/' partition(salesmonth='2008-03', event='102') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=102/' partition(salesmonth='2008-03', event='103') location 's3://redshift-downloads/tickit/spectrum/salesevent/salesmonth=2008-03/event=103/';

다음 쿼리를 실행하여 파티셔닝된 테이블에서 데이터를 선택합니다.

select spectrum.sales_event.salesmonth, event.eventname, sum(spectrum.sales_event.pricepaid) from spectrum.sales_event, event where spectrum.sales_event.eventid = event.eventid and salesmonth = '2008-02' and (event = '101' or event = '102' or event = '103') group by event.eventname, spectrum.sales_event.salesmonth order by 3 desc;
salesmonth | eventname       | sum    
-----------+-----------------+--------
2008-02    | The Magic Flute | 5062.00
2008-02    | La Sonnambula   | 3498.00
2008-02    | Die Walkure     |  534.00

외부 테이블 열을 ORC 열에 매핑

Amazon Redshift Spectrum은 외부 테이블을 사용하여 ORC 형식의 파일에서 데이터를 쿼리합니다. ORC(Optimized Row Columnar) 형식은 중첩된 데이터 구조를 지원하는 컬럼 방식 스토리지 파일 형식입니다. 중첩 데이터 쿼리에 대한 자세한 내용은 Amazon Redshift Spectrum을 사용한 중첩 데이터에 대한 쿼리 섹션을 참조하세요.

ORC 파일의 데이터를 참조하는 외부 테이블을 만드는 경우 외부 테이블의 각 열을 ORC 데이터의 열에 매핑합니다. 이렇게 하려면 다음 방법 중 하나를 사용하십시오.

기본값은 열 이름별 매핑입니다.

위치별 매핑

위치별 매핑을 사용하면 외부 테이블에 정의된 첫 번째 열이 ORC 데이터 파일의 첫 번째 열에 매핑되고 두 번째 열은 두 번째 열에 매핑됩니다. 위치별 매핑을 사용하려면 외부 테이블과 ORC 파일의 열 순서가 일치해야 합니다. 열의 순서가 일치하지 않으면 열을 이름별로 매핑할 수 있습니다.

중요

이전 릴리스에서는 기본적으로 위치별 매핑을 사용했습니다. 기존 테이블에 대해 위치별 매핑을 계속 사용해야 하는 경우, 다음 예와 같이 테이블 속성 orc.schema.resolutionposition으로 설정합니다.

alter table spectrum.orc_example set table properties('orc.schema.resolution'='position');

예를 들어 SPECTRUM.ORC_EXAMPLE 테이블은 다음과 같이 정의됩니다.

create external table spectrum.orc_example( int_col int, float_col float, nested_col struct< "int_col" : int, "map_col" : map<int, array<float >> > ) stored as orc location 's3://example/orc/files/';

이 테이블 구조는 다음과 같이 추상화될 수 있습니다.

• 'int_col' : int
• 'float_col' : float
• 'nested_col' : struct
   o 'int_col' : int
   o 'map_col' : map
      - key : int
      - value : array
         - value : float

기본 ORC 파일의 파일 구조는 다음과 같습니다.

• ORC file root(id = 0)
   o 'int_col' : int (id = 1)
   o 'float_col' : float (id = 2)
   o 'nested_col' : struct (id = 3)
      - 'int_col' : int (id = 4)
      - 'map_col' : map (id = 5)
         - key : int (id = 6)
         - value : array (id = 7)
            - value : float (id = 8)

이 예에서는 외부 테이블의 각 열을 위치별로 ORC 파일의 열에 정확하게 매핑할 수 있습니다. 다음은 매핑을 보여줍니다.

외부 테이블 열 이름 ORC 열 ID ORC 열 이름
int_col 1 int_col
float_col 2 float_col
nested_col 3 nested_col
nested_col.int_col 4 int_col
nested_col.map_col 5 map_col
nested_col.map_col.key 6 NA
nested_col.map_col.value 7 NA
nested_col.map_col.value.item 8 NA

열 이름별 매핑

이름 매핑을 사용하면 동일한 레벨에 있는 ORC 파일에서 같은 이름으로 명명된 열에 외부 테이블의 열을 매핑할 수 있습니다.

예를 들어, 앞의 예인 SPECTRUM.ORC_EXAMPLE의 테이블을 다음 파일 구조를 사용하는 ORC 파일과 매핑하려고 한다고 가정합니다.

• ORC file root(id = 0)
   o 'nested_col' : struct (id = 1)
      - 'map_col' : map (id = 2)
         - key : int (id = 3)
         - value : array (id = 4)
            - value : float (id = 5)
      - 'int_col' : int (id = 6)
   o 'int_col' : int (id = 7)
   o 'float_col' : float (id = 8)

Redshift Spectrum은 위치 매핑을 사용하여 다음과 같은 매핑을 시도합니다.

외부 테이블 열 이름 ORC 열 ID ORC 열 이름
int_col 1 struct
float_col 7 int_col
nested_col 8 float_col

앞의 위치 매핑을 사용하여 테이블을 쿼리할 경우 구조가 다르기 때문에 유형 검증 시 SELECT 명령이 실패합니다.

열 이름 매핑을 사용하여 이전 예에 표시된 두 파일 구조에 동일한 외부 테이블을 매핑할 수 있습니다. 테이블 열 int_col, float_colnested_col은 열 이름별 매핑을 통해 ORC 파일에서 같은 이름을 가진 열에 매핑됩니다. 외부 테이블의 nested_col 열은 map_colint_col 하위 열이 있는 struct 열입니다. 또한 하위 열은 열 이름별로 ORC 파일의 해당 열과 올바르게 매핑됩니다.

Apache Hudi에서 관리되는 데이터에 대한 외부 테이블 생성

Apache Hudi CoW(쓸 때 복사) 형식으로 데이터를 쿼리하려면 Amazon Redshift Spectrum 외부 테이블을 사용합니다. Hudi Copy On Write 테이블은 Amazon S3에 저장된 Apache Parquet 파일의 모음입니다. 삽입, 삭제, upsert 쓰기 작업으로 생성 및 수정된 Apache Hudi 버전 0.5.2, 0.6.0, 0.7.0, 0.8.0, 0.9.0, 0.10.0, 0.10.1, 0.11.0, 0.11.1에서 쓸 때 복사(CoW) 테이블을 읽을 수 있습니다. 예를 들어 부트스트랩 테이블은 지원되지 않습니다. 자세한 내용은 오픈 소스 Apache Hudi 설명서의 Copy On Write Table 섹션을 참조하세요.

Hudi CoW 형식의 데이터를 참조하는 외부 테이블을 생성하는 경우 외부 테이블의 각 열을 Hudi 데이터의 열에 매핑합니다. 매핑은 열별로 수행됩니다.

분할 및 분할되지 않은 Hudi 테이블에 대한 데이터 정의 언어(DDL) 문은 다른 Apache Parquet 파일 형식에 대한 문과 유사합니다. Hudi 테이블의 경우 INPUTFORMATorg.apache.hudi.hadoop.HoodieParquetInputFormat으로 정의합니다. LOCATION 파라미터는 Hudi 커밋 타임라인을 설정하는 데 필요한 .hoodie 폴더가 포함된 Hudi 테이블 기본 폴더를 가리켜야 합니다. 경우에 따라 Hudi 테이블에 대한 SELECT 작업이 실패하고 [유효한 Hudi 커밋 타임라인 없음(No valid Hudi commit timeline found)] 메시지가 표시될 수 있습니다. 이러한 경우 .hoodie 폴더가 올바른 위치에 있고 유효한 Hudi 커밋 타임라인이 포함되어 있는지 확인합니다.

참고

Apache Hudi 형식은 AWS Glue Data Catalog를 사용할 때만 지원됩니다. Apache Hive 메타스토어를 외부 카탈로그로 사용할 때는 지원되지 않습니다.

분할되지 않은 테이블을 정의하는 DDL의 형식은 다음과 같습니다.

CREATE EXTERNAL TABLE tbl_name (columns) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://s3-bucket/prefix'

분할된 테이블을 정의하는 DDL의 형식은 다음과 같습니다.

CREATE EXTERNAL TABLE tbl_name (columns) PARTITIONED BY(pcolumn1 pcolumn1-type[,...]) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://s3-bucket/prefix'

분할된 Hudi 테이블에 파티션을 추가하려면 ALTER TABLE ADD PARTITION 명령을 실행합니다. 여기서 LOCATION 파라미터는 파티션에 속한 파일이 있는 Amazon S3 하위 폴더를 가리킵니다.

파티션을 추가하는 DDL의 형식은 다음과 같습니다.

ALTER TABLE tbl_name ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...]) LOCATION 's3://s3-bucket/prefix/partition-path'

Delta Lake에서 관리되는 데이터에 대한 외부 테이블 생성

Delta Lake 테이블의 데이터를 쿼리하려면 Amazon Redshift Spectrum 외부 테이블을 사용합니다.

Redshift Spectrum에서 Delta Lake 테이블에 액세스하려면 쿼리 전에 매니페스트를 생성합니다. Delta Lake 매니페스트에는 Delta Lake 테이블의 일관된 스냅샷을 구성하는 파일 목록이 들어 있습니다. 분할된 테이블에는 파티션당 하나의 매니페스트가 있습니다. Delta Lake 테이블은 Amazon S3에 저장된 Apache Parquet 파일의 모음입니다. 자세한 내용은 오픈 소스 Delta Lake 설명서의 Delta Lake 섹션을 참조하세요.

Delta Lake 테이블의 데이터를 참조하는 외부 테이블을 생성하는 경우 외부 테이블의 각 열을 Delta Lake 테이블의 열에 매핑합니다. 매핑은 열 이름별로 수행됩니다.

분할 및 분할되지 않은 Delta Lake 테이블의 DDL은 다른 Apache Parquet 파일 형식의 DDL과 유사합니다. Delta Lake 테이블에 대해 INPUTFORMATorg.apache.hadoop.hive.ql.io.SymlinkTextInputFormat으로, OUTPUTFORMATorg.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat으로 정의합니다. LOCATION 파라미터는 테이블 기본 폴더의 매니페스트 폴더를 가리켜야 합니다. Delta Lake 테이블에서 SELECT 작업이 실패하는 경우 가능한 이유는 Delta Lake 테이블에 대한 제한 사항 및 문제 해결 섹션을 참조하세요.

분할되지 않은 테이블을 정의하는 DDL의 형식은 다음과 같습니다.

CREATE EXTERNAL TABLE tbl_name (columns) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest'

분할된 테이블을 정의하는 DDL의 형식은 다음과 같습니다.

CREATE EXTERNAL TABLE tbl_name (columns) PARTITIONED BY(pcolumn1 pcolumn1-type[,...]) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://s3-bucket>/prefix/_symlink_format_manifest'

분할된 Delta Lake 테이블에 파티션을 추가하려면 ALTER TABLE ADD PARTITION 명령을 실행합니다. 여기서 LOCATION 파라미터는 파티션의 매니페스트가 들어 있는 Amazon S3 하위 폴더를 가리킵니다.

파티션을 추가하는 DDL의 형식은 다음과 같습니다.

ALTER TABLE tbl_name ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...]) LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest/partition-path'

또는 Delta Lake 매니페스트 파일을 직접 가리키는 DDL을 실행합니다.

ALTER TABLE tbl_name ADD IF NOT EXISTS PARTITION(pcolumn1=pvalue1[,...]) LOCATION 's3://s3-bucket/prefix/_symlink_format_manifest/partition-path/manifest'

Delta Lake 테이블에 대한 제한 사항 및 문제 해결

Redshift Spectrum에서 Delta Lake 테이블을 쿼리할 때 다음 사항을 고려하세요.

  • 매니페스트가 더 이상 존재하지 않는 스냅샷이나 파티션을 가리키는 경우 유효한 새 매니페스트가 생성될 때까지 쿼리가 실패합니다. 예를 들어 이는 기본 테이블에 대한 VACUUM 작업의 결과일 수 있습니다.

  • Delta Lake 매니페스트는 파티션 수준의 일관성만 제공합니다.

다음 표에서는 Delta Lake 테이블을 쿼리할 때 특정 오류에 대한 몇 가지 잠재적인 원인을 설명합니다.

오류 메시지 가능한 원인

버킷 s3-bucket-1의 Delta Lake 매니페스트는 버킷 s3-bucket-2의 항목을 포함할 수 없습니다.

매니페스트 항목은 지정된 버킷과 다른 Amazon S3 버킷에 있는 파일을 가리킵니다.

Delta Lake 파일은 동일한 폴더에 있어야 합니다.

매니페스트 항목은 지정된 접두사와 다른 Amazon S3 접두사를 가진 파일을 가리킵니다.

Delta Lake 매니페스트 manifest-path에 나열된 파일 filename을 찾을 수 없습니다.

매니페스트에 나열된 파일을 Amazon S3에서 찾을 수 없습니다.

Delta Lake 매니페스트를 가져오는 중 오류가 발생했습니다.

Amazon S3에서 매니페스트를 찾을 수 없습니다.

유효하지 않은 S3 경로입니다.

매니페스트 파일의 항목이 유효한 Amazon S3 경로가 아니거나 매니페스트 파일이 손상되었습니다.