Athena에서 CTAS 쿼리를 실행할 때 파일 수 또는 크기를 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 9월 8일

Amazon Athena에서 CREATE TABLE AS SELECT(CTAS) 쿼리를 실행할 때 파일 수 또는 파일당 데이터 양을 정의하려고 합니다.

해결 방법

버켓팅을 사용하여 CTAS 쿼리에서 파일 크기 또는 파일 수를 설정합니다.

참고: 다음의 단계에서는 Global Historical Climatology Network Daily 퍼블릭 데이터 세트(s3://noaa-ghcn-pds/csv.gz/)를 사용하여 솔루션을 설명합니다. 이 데이터 세트에 대한 자세한 내용은 Amazon Athena 및 Amazon QuickSight를 사용하여 200년간의 글로벌 기후 데이터 시각화를 참조하세요. 다음 단계에서는 데이터 세트를 검사하고 환경을 생성한 다음 데이터 세트를 수정하는 방법을 보여 줍니다.

  1. Amazon Simple Storage Service(Amazon S3) 데이터 세트의 파일 수를 수정합니다.
  2. 각 파일의 대략적인 크기를 설정합니다.
  3. 데이터 형식을 변환하고 대략적인 파일 크기를 설정합니다.

데이터 세트 검사

다음의 AWS Command Line Interface(AWS CLI)를 실행하여 파일 수와 데이터 세트의 크기를 확인합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

aws s3 ls s3://noaa-ghcn-pds/csv.gz/ --summarize --recursive --human-readable

출력은 다음과 유사합니다.

2019-11-30 01:58:05    3.3 KiB csv.gz/1763.csv.gz
2019-11-30 01:58:06    3.2 KiB csv.gz/1764.csv.gz
2019-11-30 01:58:06    3.3 KiB csv.gz/1765.csv.gz
2019-11-30 01:58:07    3.3 KiB csv.gz/1766.csv.gz
...
2019-11-30 02:05:43  199.7 MiB csv.gz/2016.csv.gz
2019-11-30 02:05:50  197.7 MiB csv.gz/2017.csv.gz
2019-11-30 02:05:54  197.0 MiB csv.gz/2018.csv.gz
2019-11-30 02:05:57  168.8 MiB csv.gz/2019.csv.gz

Total Objects: 257
Total Size: 15.4 GiB

환경 생성

1.    다음과 비슷한 문을 실행하여 테이블을 생성합니다.

CREATE EXTERNAL TABLE historic_climate_gz(
  id string,
  yearmonthday int,
  element string,
  temperature int,
  m_flag string,
  q_flag string,
  s_flag string,
  obs_time int)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://noaa-ghcn-pds/csv.gz/'

2.    다음 명령을 실행하여 테이블을 테스트합니다.

SELECT * FROM historic_climate_gz LIMIT 10

출력은 데이터 세트의 10줄을 보여 줍니다. 환경이 생성된 후 CTAS 쿼리를 실행할 때 다음 방법 중 하나 이상을 사용하여 데이터 세트를 수정합니다.

데이터 세트의 파일 수 수정

카디널리티가 높고 값이 고르게 분산된 열을 기준으로 데이터를 버킷하는 것이 모범 사례입니다. 자세한 내용은 버켓팅과 파티셔닝을 참조하십시오. 다음 예제에서는 yearmonthday 필드를 사용합니다.

1.    데이터 세트를 20개의 파일로 변환하려면 다음과 비슷한 문을 실행합니다.

CREATE TABLE "historic_climate_gz_20_files"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_gz_20_files/',
      format = 'TEXTFILE',
      bucket_count=20,
      bucketed_by = ARRAY['yearmonthday']
     ) AS
SELECT * FROM historic_climate_gz

쿼리에서 다음 값을 바꿉니다.
external_location: Athena가 CTAS 쿼리를 저장하는 Amazon S3의 위치
format: 출력에 사용하려는 형식(예: ORC, PARQUET, AVRO, JSON, TEXTFILE)
bucket_count: 원하는 파일 수(예: 20개)
bucketed_by: 버킷에 데이터를 해싱하고 저장하는 필드(예: yearmonthday)

2.    다음 명령을 실행하여 버킷에 원하는 수의 파일이 포함되어 있는지 확인합니다.

aws s3 ls s3://awsexamplebucket/historic_climate_gz_20_files/ --summarize --recursive --human-readable
Total Objects: 20
Total Size: 15.6 Gib

각 파일의 대략적인 크기 설정

1.    원하는 파일 크기를 달성하는 데 필요한 파일 수를 결정합니다. 예를 들어 15.4GB 데이터 세트를 2GB 파일로 분할하려면 파일 8개(15.4/2 = 7.7, 8로 반올림)가 필요합니다.

2.    다음과 비슷한 문을 실행합니다.

CREATE TABLE "historic_climate_gz_2GB_files"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_gz_2GB_file/',
      format = 'TEXTFILE',
      bucket_count=8,
      bucketed_by = ARRAY['yearmonthday']) AS
SELECT * FROM historic_climate_gz

쿼리에서 다음 값을 바꿉니다.
external_location: Athena가 CTAS 쿼리를 저장하는 Amazon S3의 위치
format: 원본 데이터와 동일한 형식이어야 함(예: ORC, PARQUET, AVRO, JSON, TEXTFILE)
bucket_count: 원하는 파일 수(예: 20개)
bucketed_by: 버킷에 데이터를 해싱하고 저장하는 필드. 카디널리티가 높은 필드를 선택합니다.

3.    다음 명령을 실행하여 데이터 세트에 원하는 수의 파일이 포함되어 있는지 확인합니다.

aws s3 ls s3://awsexamplebucket/historic_climate_gz_2GB_file/ --summarize --recursive --human-readable

출력은 다음과 유사합니다.

2019-09-03 10:59:20    1.7 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00000.gz
2019-09-03 10:59:20    2.0 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00001.gz
2019-09-03 10:59:20    2.0 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00002.gz
2019-09-03 10:59:19    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00003.gz
2019-09-03 10:59:17    1.7 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00004.gz
2019-09-03 10:59:21    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00005.gz
2019-09-03 10:59:18    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00006.gz
2019-09-03 10:59:17    1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00007.gz
Total Objects: 8
Total Size: 15.0 GiB

데이터 형식을 변환하고 대략적인 파일 크기를 설정합니다.

1.    다음과 비슷한 문을 실행하여 데이터를 다른 형식으로 변환합니다.

CREATE TABLE "historic_climate_parquet"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_parquet/',
      format = 'PARQUET') AS
SELECT * FROM historic_climate_gz

쿼리에서 다음 값을 바꿉니다.
external_location: Athena가 CTAS 쿼리를 저장하는 Amazon S3의 위치
format:
변환하려는 형식(예: ORC,PARQUET, AVRO, JSON, TEXTFILE)

2.    다음 명령을 실행하여 데이터 세트의 크기를 확인합니다.

aws s3 ls s3://awsexamplebucket/historic_climate_parquet/ --summarize --recursive --human-readable

출력은 다음과 유사합니다.

Total Objects: 30
Total Size: 9.8 GiB

3.    원하는 파일 크기를 달성하는 데 필요한 파일 수를 결정합니다. 예를 들어, 500MB 파일을 원하고 데이터 세트가 9.8GB인 경우 20개의 파일(9,800/500=19.6, 20으로 반올림)이 필요합니다.

4.    데이터 세트를 500MB 파일로 변환하려면 다음과 비슷한 문을 실행합니다.

CREATE TABLE "historic_climate_parquet_500mb"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_parquet_500mb/',
      format = 'PARQUET',
      bucket_count=20,
      bucketed_by = ARRAY['yearmonthday']
       ) AS
SELECT * FROM historic_climate_parquet

쿼리에서 다음 값을 바꿉니다.
external_location: Athena가 CTAS 쿼리를 저장하는 Amazon S3의 위치
bucket_count:
원하는 파일 수(예: 20개)
bucketed_by: 버킷에 데이터를 해싱하고 저장하는 필드. 카디널리티가 높은 필드를 선택합니다.

5.    다음 명령을 실행하여 데이터 세트에 원하는 수의 파일이 포함되어 있는지 확인합니다.

aws s3 ls s3://awsexamplebucket/historic_climate_parquet_500mb/ --summarize --recursive --human-readable

출력은 다음과 유사합니다.

2019-09-03 12:01:45  333.9 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00000
2019-09-03 12:01:01  666.7 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00001
2019-09-03 12:01:00  665.6 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00002
2019-09-03 12:01:06  666.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00003
2019-09-03 12:00:59  667.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00004
2019-09-03 12:01:27  666.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00005
2019-09-03 12:01:10  666.5 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00006
2019-09-03 12:01:12  668.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00007
2019-09-03 12:01:03  666.8 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00008
2019-09-03 12:01:10  646.4 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00009
2019-09-03 12:01:35  639.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00010
2019-09-03 12:00:52  529.5 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00011
2019-09-03 12:01:29  334.2 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00012
2019-09-03 12:01:32  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00013
2019-09-03 12:01:34  332.2 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00014
2019-09-03 12:01:44  333.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00015
2019-09-03 12:01:51  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00016
2019-09-03 12:01:39  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00017
2019-09-03 12:01:47  333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00018
2019-09-03 12:01:49  332.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00019
Total Objects: 20
Total Size: 9.9 GiB

참고: 버킷 테이블에서는 INSERT INTO 문이 지원되지 않습니다. 자세한 내용은 지원되지 않는 버킷 테이블을 참조하세요.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?