Athena で CTAS クエリを実行するときに、ファイルの数またはサイズを設定するにはどうすればよいですか?
Amazon Athena で CREATE TABLE AS SELECT (CTAS) クエリを実行するとき、ファイルの数またはファイルごとのデータの量を定義する必要があります。
解決方法
バケットを使用して、CTAS クエリのファイルサイズまたはファイル数を設定します。
注: 次の手順では、Global Historical Climatology Network Daily 公開データセット (s3://noaa-ghcn-pds/csv.gz/) を使用してソリューションを説明します。このデータセットの詳細については、「Amazon Athena と Amazon QuickSight を使用した 200 年以上の地球規模の気候データの視覚化」を参照してください。これらのステップは、データセットを確認し、環境を作成し、データセットを変更する方法を示しています。
- Amazon Simple Storage Service (Amazon S3) データセットのファイル数を変更します。
- 各ファイルのおおよそのサイズを設定します。
- データ形式を変換し、おおよそのファイルサイズを設定します。
データセットの確認
次の 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 ステートメントは、バケット化されたテーブルではサポートされていません。詳細については、「バケットテーブルがサポートされていません」を参照してください。
関連情報
関連するコンテンツ
- 質問済み 24日前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 3年前