跳至內容

在 Amazon Athena 中執行 CTAS 查詢時,如何調整檔案的數量或大小?

3 分的閱讀內容
0

當我在 Amazon Athena 中執行 CREATE TABLE AS SELECT (CTAS) 查詢時,我想要定義檔案的數量或每個檔案的資料量。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

您可以在 CTAS 查詢中使用分割儲存貯體來控制輸出檔案的數量。但是,建立的檔案數量可能不一定與指定的儲存貯體數量相符。分割儲存貯體功能可以將相似的資料分組在一起,但無法精確控制檔案數量。

以下解決方案使用全球歷史氣候網路每日公共資料集 s3://noaa-ghcn-pds/csv.gz/。如需詳細資訊,請參閱使用 Amazon Athena 和 Amazon Quick Sight 視覺化 200 多年的全球氣候資料

**注意:**在以下範例命令中,將以下值替換為您的值:

**external_location:**您儲存 CTAS 查詢的 Amazon Simple Storage Service (Amazon S3) 位置。

**格式:**您想要的輸出格式,例如 ORC、PARQUET、AVRO、JSON 或 TEXTFILE。

**bucket_count:**您想要的儲存貯體數量。

**bucketed_by:**用於對儲存貯體中的資料進行雜湊處理並儲存的欄位,例如 yearmonthday

檢查資料集

若要確認檔案數量和資料集大小,請執行以下 ls 命令:

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

**注意:**將 s3://noaa-ghcn-pds/csv.gz/ 替換為您的 s3 儲存貯體路徑。

輸出範例:

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 查詢時使用下列方法修改資料集。

修改資料集中的檔案數量

最佳做法是按照具有高基數和均勻分布值的資料欄來儲存資料。如需詳細資訊,請參閱分割儲存貯體優勢

請完成下列步驟:

  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

    **注意:**上述範例使用了 yearmonthday 欄位。

  2. 若要確認儲存貯體是否包含所需數量的檔案,請執行以下 ls 命令:

    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
  3. 若要確認資料集是否包含所需數量的檔案,請執行以下 ls 命令:

    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
  2. 若要確認資料集的大小,請執行以下 ls 命令:

    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 個檔案。

  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
  5. 若要確認資料集是否包含所需數量的檔案,請執行以下 ls 命令:

    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 官方已更新 1 年前