Ir para o conteúdo

Como ajusto o número ou o tamanho dos arquivos quando executo uma consulta CTAS no Amazon Athena?

6 minuto de leitura
0

Quando executo uma consulta CREATE TABLE AS SELECT (CTAS) no Amazon Athena, quero definir o número de arquivos ou a quantidade de dados para cada arquivo.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

É possível usar o bucketing em uma consulta CTAS para controlar o número de arquivos de saída. No entanto, o número de arquivos criados pode nem sempre corresponder ao número especificado de buckets. O atributo de bucketing pode agrupar dados semelhantes, mas não pode controlar com precisão a contagem de arquivos.

A resolução a seguir usa o conjunto de dados públicos diários da Rede histórica global de climatologia, s3://noaa-ghcn-pds/csv.gz/. Para obter mais informações, consulte Visualize over 200 years of global climate data using Amazon Athena and Amazon Quick Sight (Visualize mais de 200 anos de dados climáticos globais usando o Amazon Athena e o Amazon Quick Sight).

Observação: nos comandos de exemplo a seguir, substitua os seguintes valores pelos seus valores:

external_location: Local do Amazon Simple Storage Service (Amazon S3) em que você salvou sua consulta de CTAS.

formato: O formato que você deseja para a saída, como ORC, PARQUET, AVRO, JSON ou TEXTFILE.

bucket_count: O número de buckets que você deseja.

bucketed_by: O campo para fazer o hash e salvar os dados no bucket, por exemplo, yearmonthday.

Examine o conjunto de dados

Para verificar o número de arquivos e o tamanho do conjunto de dados, execute o seguinte comando ls:

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

Observação: substitua s3://noaa-ghcn-pds/csv.gz/ pelo caminho do seu bucket do s3.

Exemplo de saída:

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

Crie o ambiente

Conclua as etapas a seguir:

  1. Para criar uma tabela, execute o seguinte 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. Para testar a tabela, execute o seguinte comando:

    SELECT * FROM historic_climate_gz LIMIT 10

    A saída mostra 10 linhas do conjunto de dados.

Depois de criar o ambiente, use os métodos a seguir para modificar o conjunto de dados ao executar consultas CTAS.

Modifique o número de arquivos no conjunto de dados

É uma prática recomendada agrupar os dados em uma coluna com alta cardinalidade e valores distribuídos uniformemente. Para obter mais informações, consulte Benefícios do bucketing.

Conclua as etapas a seguir:

  1. Para converter o conjunto de dados em 20 arquivos, execute o seguinte 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

    Observação: o exemplo anterior usa o campo yearmonthday.

  2. Para confirmar se o bucket contém o número desejado de arquivos, execute o seguinte comando ls:

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

    Exemplo de saída:

    Total Objects: 20
    Total Size: 15.6 Gib

Defina o tamanho aproximado de cada arquivo

Conclua as etapas a seguir:

  1. Determine o número de buckets que você deve usar para atingir o número de arquivos desejados. Por exemplo, para dividir o conjunto de dados de 15,4 GB em arquivos de 2 GB, você precisa ter 8 arquivos (15,4 / 2 = 7,7, arredondados para 8).

  2. Para criar uma nova tabela de bucket, execute o seguinte 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. Para confirmar se o conjunto de dados contém o número desejado de arquivos, execute o seguinte comando ls:

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

    Exemplo de saída:

    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

Converta o formato dos dados e defina o tamanho aproximado do arquivo

Conclua as etapas a seguir:

  1. Para converter os dados em um formato diferente, execute o seguinte comando:

    CREATE TABLE "historic_climate_parquet" WITH (
          external_location = 's3://awsexamplebucket/historic_climate_parquet/',
          format = 'PARQUET') AS
    SELECT * FROM historic_climate_gz
  2. Para confirmar o tamanho do conjunto de dados, execute o seguinte comando ls:

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

    Exemplo de saída:

    Total Objects: 30
    Total Size: 9.8 GiB
  3. Determine o número de buckets que você deve usar para atingir o número de arquivos desejados. Por exemplo, para arquivos de 500 MB e um conjunto de dados de 9,8 GB, você precisa ter 20 arquivos.

  4. Para converter o conjunto de dados em arquivos de 500 MB, execute o seguinte 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. Para confirmar se o conjunto de dados contém o número desejado de arquivos, execute o seguinte comando ls:

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

    Exemplo de saída:

    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

Observação: tabelas agrupadas não suportam a instrução INSERT INTO.

Informações relacionadas

Exemplos de consultas de CTAS

Considerações e limitações para consultas de CTAS

AWS OFICIALAtualizada há um ano