Redshift Spectrum용 외부 테이블
이 주제에서는 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 Guide의 Getting Started Using AWS Glue, Amazon Athena User Guide의 Getting Started 또는 Amazon EMR Developer Guide의 Apache 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_oid
를 false
로 설정하여 $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가 스캔하는 데이터 양을 제한할 수 있습니다. 어떤 키를 기준으로도 데이터를 분할할 수 있습니다.
일반적인 관행은 시간을 기준으로 데이터를 파티셔닝하는 것입니다. 예를 들어 연, 월, 일, 시를 기준으로 파티셔닝할 수 있습니다. 데이터가 여러 원본에서 오는 경우, 데이터 원본 식별자와 날짜를 기준으로 파티셔닝할 수 있습니다.
다음 절차에서는 데이터를 파티셔닝하는 방법에 대해 설명합니다.
데이터를 파티셔닝하려면
-
파티션 키에 따라 Amazon S3의 폴더에 데이터를 저장합니다.
파티션 값마다 폴더를 하나씩 만들고 파티션 키와 값을 사용하여 폴더 이름을 지정합니다. 예를 들어 날짜를 기준으로 파티셔닝하는 경우, 폴더의 이름은
saledate=2017-04-01
,saledate=2017-04-02
등이 될 수 있습니다. Redshift Spectrum은 파티션 폴더에 있는 파일과 하위 폴더를 모두 스캔합니다. Redshift Spectrum은 숨겨진 파일과 마침표, 밑줄 또는 해시 표시( . , _, 또는 #)로 시작하거나 물결표(~)로 끝나는 파일은 무시합니다. -
외부 테이블을 만들고 PARTITIONED BY 절에서 파티션 키를 지정합니다.
파티션 키가 테이블 열의 이름이어서는 안 됩니다. 데이터 형식은 SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE 또는 TIMESTAMP 데이터 형식일 수 있습니다.
-
파티션을 추가합니다.
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: 여러 파티션 키로 분할
date
및 eventid
로 분할된 외부 테이블을 만들려면 다음 명령을 실행합니다.
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.resolution
을 position
으로 설정합니다.
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_col
및 nested_col
은 열 이름별 매핑을 통해 ORC 파일에서 같은 이름을 가진 열에 매핑됩니다. 외부 테이블의 nested_col
열은 map_col
및 int_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 테이블의 경우 INPUTFORMAT
을 org.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 테이블에 대해 INPUTFORMAT
을 org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat
으로, OUTPUTFORMAT
을 org.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 테이블을 쿼리할 때 특정 오류에 대한 몇 가지 잠재적인 원인을 설명합니다.
오류 메시지 | 가능한 원인 |
---|---|
|
매니페스트 항목은 지정된 버킷과 다른 Amazon S3 버킷에 있는 파일을 가리킵니다. |
|
매니페스트 항목은 지정된 접두사와 다른 Amazon S3 접두사를 가진 파일을 가리킵니다. |
|
매니페스트에 나열된 파일을 Amazon S3에서 찾을 수 없습니다. |
|
Amazon S3에서 매니페스트를 찾을 수 없습니다. |
|
매니페스트 파일의 항목이 유효한 Amazon S3 경로가 아니거나 매니페스트 파일이 손상되었습니다. |