Athena で CTAS クエリを実行するときに、ファイルの数またはサイズを設定するにはどうすればよいですか?

所要時間4分
0

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 行が表示されます。環境が作成されたら、次の 1 つ以上の方法を使用して、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 のロケーション
フォーマット: 出力に使用するフォーマット (ORC、PARQUET、AVRO、JSON、または TEXTFILE など)
bucket_count: 必要なファイルの数 (例: 20)
bucketed_by: バケット内のデータをハッシュ化して保存するためのフィールド (例: 年月日)

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.4 GB のデータセットを 2 GB のファイルに分割するには、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 のロケーション
形式: ソースデータと同じ形式 (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 のロケーション フォーマット: 変換したいフォーマット (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.    必要なファイルサイズを実現するために必要なファイルの数を決定します。たとえば、500 MB のファイルが必要で、データセットが 9.8 GB の場合、20 個のファイル (9,800 / 500 = 19.6、20 に切り上げ) が必要です。

4.    データセットを 500 MB ファイルに変換するには、次のようなステートメントを実行します。

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 ステートメントは、バケット化されたテーブルではサポートされていません。詳細については、「バケットテーブルがサポートされていません」を参照してください。


関連情報

CTAS クエリの例

CTAS クエリの考慮事項と制限

AWS公式
AWS公式更新しました 3年前