데이터 레이크에서 데이터 쿼리
시작하기 전에
이 예제에서는 2022년 1월 노란색 택시에 대한 공개 데이터인 ‘ 뉴욕 택시 여행 데이터 기록 ’를 사용합니다. 이 예제를 따라 하려면, 데이터가 액세스 가능한 S3 버킷에 있는지 확인하십시오.
S3 파일에 액세스하려면, 액세스 키 ID와 비밀 액세스 키를 제공할 수 있는 적절한 권한이 부여된 AWS 계정이 필요합니다.
AWS S3 예시
1. 외부 데이터 소스를 만듭니다.
외부 데이터 소스를 사용하면 관리자는 사용자에게 직접 키를 제공하지 않고도 S3 에 대한 액세스 권한을 부여할 수 있습니다.
데이터 소스 생성:
a) ENABLE_EXTERNAL_DATASOURCE를 설정합니다.
set ENABLE_EXTERNAL_DATASOURCE = 1;
b) 외부 데이터 소스를 만듭니다.
create EXTERNAL DATASOURCE 'DATA SOURCE' on 'REMOTE SOURCE'
using (
ACCESSKEYID 'ACCESS KEY ID' SECRETACCESSKEY 'SECRET ACCESS KEY' BUCKET 'BUCKET' REGION 'REGION'
);
예:
create EXTERNAL DATASOURCE AWS_TAXI_DATASET on AWSS3
using (
ACCESSKEYID '...' SECRETACCESSKEY '...' BUCKET 'nyc-tlc' REGION 'us-east-1'
);
자세한 내용은 CREATE EXTERNAL DATASOURCE 명령을 참조하세요.
2. 외부 테이블을 만듭니다.
외부 데이터 소스를 만든 후에는 2022년 1월부터 옐로 택시 데이터에 액세스하는 외부 테이블을 만들 수 있습니다.
외부 테이블을 생성하기 위한 권한 에 설명된 대로 필요한 권한이 있는지 확인하세요.
create EXTERNAL TABLE 'TABLE NAME' on 'DATA SOURCE'
using (
DATAOBJECT ('DATA OBJECT') FORMAT 'PARQUET'
);
DATAOBJECT 인수는 parquet 형식의 단일 파일을 참조해야 합니다. 여러 개의 parquet 파일에서 쿼리를 실행하려면 외부 테이블을 더 만들어야 합니다.
예:
create EXTERNAL TABLE YELLOW_TAXI_JANUARY_2022 on AWS_TAXI_DATASET
using (
DATAOBJECT ('/trip data/yellow_tripdata_2022-01.parquet') FORMAT 'PARQUET'
);
3. 데이터를 쿼리합니다.
데이터베이스에 데이터를 로드하지 않고도 다른 NPSaaS 테이블과 마찬가지로 외부 Parquet 형식 테이블을 쿼리할 수 있습니다.
Parquet 열 이름은 열 이름 충돌이 발생하지 않는 한 대소문자를 구분하지 않습니다.
- 2022년 1월 뉴욕에서 택시를 이용해 여행한 총 승객 수를 파악하려면 다음을 실행하세요.
select sum(passenger_count) from YELLOW_TAXI_JANUARY_2022;
출력:
SUM
-----
3324167
(1 row)
- 오전 1시부터 오전 6시 사이에 가장 많은 승객을 태운 공급업체를 식별하려면 다음을 실행하세요.
```sql {: codeblock}
select
VendorID,
sum("passenger_count") as passengers
from
YELLOW_TAXI_JANUARY_2022
where
tpep_pickup_datetime::time > '1:00am'
and tpep_pickup_datetime::time < '6:00am'
group by
VendorID
order by
passengers desc;
```
출력:
```sql {: codeblock}
VendorID| passengers
--------|----------
2 | 122251
1 | 40807
6 |
5 |
(4 rows)
```
NPSaaS 에 테이블 전체를 불러올 필요는 없습니다. *Parquet는* 열 기반 형식이므로, NPSaaS 엔진은 인터넷을 통해 테이블 전체를 전송하지 않고도 특정 열의 하위 집합에 대해 쿼리를 실행할 수 있습니다. 이렇게 하면 대용량 테이블에서 작업하는 경우 유입 트래픽을 크게 줄이고 로드 시간을 단축할 수 있습니다. 쿼리 엔진은 항상 필요한 *Parquet* 테이블의 열만 사용합니다.
{: tip}
AWS 타임아웃 오류 해결 방법
Lakehouse 쿼리 실행 중에 다음과 같은 오류가 발생하면:
AWS Error NETWORK_CONNECTION during HeadObject operation: curlCode: 28, Timeout was reached
다음 구성 값을 설정하면 이 문제를 해결할 수 있습니다:
set dlAWSConnectTimeout=10;
set dlAWSRetryStrategy=1;
set dlAWSNumRetries=10;
이 설정들은 네트워크 연결 문제를 보다 효과적으로 처리하기 위해 ‘ AWS ’의 연결 시간 초과, 재시도 전략 및 재시도 횟수를 조정합니다.
Azure BLOB 예제
ENABLE_AZURE_DATALAKE_SUPPORT를 설정합니다.
set ENABLE_AZURE_DATALAKE_SUPPORT = true;
1. 외부 데이터 소스를 만듭니다.
create EXTERNAL DATASOURCE 'DATA SOURCE' on 'REMOTE SOURCE'
using (
ACCOUNT 'ACCOUNT NAME' ACCOUNTKEY 'SECRET ACCESS KEY' CONTAINER 'CONTAINER NAME'
);
익명 액세스의 경우 ACCOUNTKEY를 생략할 수 있습니다.
create EXTERNAL DATASOURCE AZURE_TAXI_DATASET on AZUREBLOB
using (
ACCOUNT 'azureopendatastorage' CONTAINER 'nyctlc'
);
자세한 내용은 CREATE EXTERNAL DATASOURCE 명령을 참조하세요.
2. 외부 테이블을 만듭니다.
외부 데이터 소스를 만든 후에는 2018년 1월의 녹색 택시 데이터에 액세스하는 외부 테이블을 만들 수 있습니다.
외부 테이블을 생성하기 위한 권한 에 설명된 대로 필요한 권한이 있는지 확인하세요.
예:
create EXTERNAL table GREEN_TAXI_JANUARY_2018 on AZURE_TAXI_DATASET
using (
DATAOBJECT ('/green/puYear=2018/puMonth=1/part-00036-tid-4753095944193949832-fee7e113-666d-4114-9fcb-bcd3046479f3-2606-1.c000.snappy.parquet') FORMAT 'PARQUET'
);
3. 데이터를 쿼리합니다.
데이터베이스에 데이터를 로드하지 않고도 다른 NPSaaS 테이블과 마찬가지로 외부 Parquet 형식 테이블을 쿼리할 수 있습니다.
Parquet 열 이름은 열 이름 충돌이 발생하지 않는 한 대소문자를 구분하지 않습니다.
- 2018년 1월 뉴욕에서 택시를 이용해 여행한 총 승객 수를 파악하려면 다음을 실행하세요.
select sum(passengercount) from GREEN_TAXI_JANUARY_2018;
출력:
SUM
-----
1081283
(1 row)
- 오전 1시부터 오전 6시 사이에 가장 많은 승객을 태운 공급업체를 식별하려면 다음을 실행하세요.
```sql {: codeblock}
select
VendorID,
sum(passengercount) as passengers
from
GREEN_TAXI_JANUARY_2018
where
lpeppickupdatetime::time > '1:00am'
and lpeppickupdatetime::time < '6:00am'
group by
VendorID
order by
passengers desc;
```
출력:
```sql {: codeblock}
VendorID| passengers
--------|----------
2 | 122251
1 | 40807
6 |
5 |
(4 rows)
```