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

최종 업데이트 날짜: 2020년 1월 3일

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 명령줄 인터페이스(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개의 파일로 변환하려면 다음과 비슷한 문을 실행합니다. 다음 필드의 값을 바꿉니다.

external_location: Athena가 CTAS 쿼리를 저장하는 Amazon S3 위치 format: 출력에 사용할 형식(예: ORC, PARQUET, AVRO, JSON 또는 TEXTFILE) bucket_count: 원하는 파일 수(예: 20) bucketed_by: 버킷에 데이터를 해싱하고 저장하는 필드(예: yearmonthday)

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

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.    다음과 비슷한 문을 실행합니다. 다음 필드의 값을 바꿉니다.

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

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

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.    다음과 비슷한 문을 실행하여 데이터를 다른 형식으로 변환합니다. 다음 필드의 값을 바꿉니다.

external_location: Athena가 CTAS 쿼리를 저장하는 Amazon S3 위치 format: 변환하려는 형식(ORC, PARQUET, AVRO, JSON 또는 TEXTFILE)

CREATE TABLE "historic_climate_parquet"
WITH (
      external_location = 's3://awsexamplebucket/historic_climate_parquet/',
      format = 'PARQUET') as
select * from historic_climate_gz

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 파일로 변환하려면 다음과 비슷한 문을 실행합니다. 다음 필드의 값을 바꿉니다.

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

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

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

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?