Salta al contenuto

Come posso modificare il numero o la dimensione dei file quando eseguo una query CTAS in Amazon Athena?

6 minuti di lettura
0

Quando eseguo una query CREATE TABLE AS SELECT (CTAS) in Amazon Athena, desidero definire il numero di file o la quantità di dati per ogni file.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Puoi utilizzare il raggruppamento in bucket in una query CTAS per controllare il numero di file di output. Tuttavia, il numero di file creati potrebbe non corrispondere sempre al numero di bucket specificato. La funzione di raggruppamento in bucket può raggruppare dati simili, ma non può controllare con precisione il numero di file.

La seguente risoluzione utilizza il set di dati pubblico del Global Historical Climatology Network Daily, s3://noaa-ghcn-pds/csv.gz/. Per ulteriori informazioni, consulta Visualize over 200 years of global climate data using Amazon Athena and Amazon Quick Sight (Visualizzazione di oltre 200 anni di dati climatici globali utilizzando Amazon Athena e Amazon Quick Sight).

Nota: nel seguenti esempi di comando, sostituisci i seguenti valori con i tuoi:

external_location: posizione di Amazon Simple Storage Service (Amazon S3) in cui hai salvato la query CTAS.

format: formato desiderato per l'output, ad esempio ORC, PARQUET, AVRO, JSON o TEXTFILE.

bucket_count: numero di bucket che desideri.

bucketed_by: campo per l'hashing e il salvataggio dei dati nel bucket, ad esempio yearmonthday.

Esamina il set di dati

Per verificare il numero di file e la dimensione del set di dati, esegui questo comando ls:

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

Nota: sostituisci s3://noaa-ghcn-pds/csv.gz/ con il percorso del tuo bucket S3.

Esempio di output:

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

Crea l'ambiente

Completa i seguenti passaggi:

  1. Per creare una tabella, esegui questo comando:

    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. Per testare la tabella, esegui questo comando:

    SELECT * FROM historic_climate_gz LIMIT 10

    L'output mostra 10 righe del set di dati.

Dopo aver creato l'ambiente, utilizza i seguenti metodi per modificare il set di dati quando esegui le query CTAS.

Modifica il numero di file nel set di dati

È consigliabile raggruppare i dati in base a una colonna con elevata cardinalità e valori distribuiti uniformemente. Per ulteriori informazioni, consulta Vantaggi del raggruppamento in bucket.

Completa i seguenti passaggi:

  1. Per convertire il set di dati in 20 file, esegui questo comando:

    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

    Nota: l'esempio precedente utilizza il campo yearmonthday.

  2. Per verificare che il bucket contenga il numero di file desiderato, esegui questo comando ls:

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

    Esempio di output:

    Total Objects: 20
    Total Size: 15.6 Gib

Configura la dimensione approssimativa di ogni file

Completa i seguenti passaggi:

  1. Determina il numero di bucket da utilizzare per ottenere il numero di file desiderato. Ad esempio, per suddividere il set di dati da 15,4 GB in file da 2 GB, è necessario avere 8 file (15,4/2 = 7,7, arrotondato a 8).

  2. Per creare una nuova tabella con bucket, esegui questo comando:

    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. Per verificare che il set di dati contenga il numero di file desiderato, esegui questo comando ls:

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

    Esempio di output:

    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

Converti il formato dei dati e imposta la dimensione approssimativa dei file

Completa i seguenti passaggi:

  1. Per convertire i dati in un formato diverso, esegui questo comando:

    CREATE TABLE "historic_climate_parquet" WITH (
          external_location = 's3://awsexamplebucket/historic_climate_parquet/',
          format = 'PARQUET') AS
    SELECT * FROM historic_climate_gz
  2. Per verificare la dimensione del set di dati, esegui questo comando ls:

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

    Esempio di output:

    Total Objects: 30
    Total Size: 9.8 GiB
  3. Determina il numero di bucket da utilizzare per ottenere il numero di file desiderato. Ad esempio, per file da 500 MB e un set di dati di 9,8 GB, devi avere 20 file.

  4. Per convertire il set di dati in file da 500 MB, esegui questo comando:

    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. Per verificare che il set di dati contenga il numero di file desiderato, esegui questo comando ls:

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

    Esempio di output:

    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

Nota: le tabelle con bucket non supportano l'istruzione INSERT INTO.

Informazioni correlate

Esempi di query CTAS

Considerazioni e restrizioni per le query CTAS

AWS UFFICIALEAggiornata un anno fa