Direkt zum Inhalt

Wie passe ich die Anzahl oder Größe der Dateien an, wenn ich eine CTAS-Abfrage in Amazon Athena ausführe?

Lesedauer: 6 Minute
0

Wenn ich eine CREATE TABLE AS SELECT (CTAS)-Abfrage in Amazon Athena ausführe, möchte ich die Anzahl der Dateien oder die Datenmenge für jede Datei definieren.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Du kannst Buckets in einer CTAS-Abfrage verwenden, um die Anzahl der Ausgabedateien zu steuern. Die Anzahl der erstellten Dateien entspricht jedoch möglicherweise nicht immer der angegebenen Anzahl von Buckets. Die Bucketing-Funktion kann ähnliche Daten gruppieren, aber sie kann die Dateianzahl nicht genau steuern.

Die folgende Auflösung verwendet den öffentlichen Datensatz des Global Historical Climatology Network Daily, s3://noaa-ghcn-pds/csv.gz/. Weitere Informationen findest du unter Visualisieren von globalen Klimadaten aus über 200 Jahren mit Amazon Athena und Amazon QuickSight.

Hinweis: Ersetze in den folgenden Beispielbefehlen die folgenden Werte durch deine Werte:

external_location: Amazon Simple Storage Service (Amazon S3)-Speicherort, an dem du die CTAS-Abfrage gespeichert hast.

format: Das Format, das du für die Ausgabe möchtest, z. B. ORC, PARQUET, AVRO, JSON oder TEXTFILE.

bucket_count: Die Anzahl der Buckets, die du möchtest.

bucketed_by: Das Feld, um den Hashwert der Daten im Bucket zu ermitteln und sie dort zu speichern, zum Beispiel yearmonthday.

Den Datensatz untersuchen

Führe den folgenden ls-Befehl aus, um die Anzahl der Dateien und die Größe des Datensatzes zu überprüfen:

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

Hinweis: Ersetze s3://noaa-ghcn-pds/csv.gz/ durch den S3-Bucket-Pfad.

Beispielausgabe:

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

Die Umgebung erstellen

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um eine Tabelle zu erstellen:

    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. Führe den folgenden Befehl aus, um die Tabelle zu testen:

    SELECT * FROM historic_climate_gz LIMIT 10

    Die Ausgabe zeigt 10 Zeilen aus dem Datensatz.

Nachdem du die Umgebung erstellt hast, verwende die folgenden Methoden, um die Datenmenge zu ändern, wenn du CTAS-Abfragen ausführst.

Anzahl der Dateien im Datensatz ändern

Es hat sich bewährt, Daten nach einer Spalte zu gruppieren, die eine hohe Kardinalität und gleichmäßig verteilte Werte aufweist. Weitere Informationen findest du unter Bucketing-Vorteile.

Führe die folgenden Schritte aus:

  1. Um den Datensatz in 20 Dateien zu konvertieren, führe den folgenden Befehl aus:

    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

    Hinweis: Im vorherigen Beispiel wird das Feld yearmonthday verwendet.

  2. Um dich zu vergewissern, dass der Bucket die gewünschte Anzahl von Dateien enthält, führe den folgenden ls-Befehl aus:

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

    Beispielausgabe:

    Total Objects: 20
    Total Size: 15.6 Gib

Die ungefähre Größe jeder Datei einstellen

Führe die folgenden Schritte aus:

  1. Ermittle die Anzahl der Buckets, die du verwenden musst, um die Anzahl der gewünschten Dateien zu erreichen. Um beispielsweise den 15,4-GB-Datensatz in 2-GB-Dateien aufzuteilen, benötigst du 8 Dateien (15,4 / 2 = 7,7, aufgerundet auf 8).

  2. Führe den folgenden Befehl aus, um eine neue Bucket-Tabelle zu erstellen:

    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. Um zu bestätigen, dass der Datensatz die gewünschte Anzahl von Dateien enthält, führe den folgenden ls-Befehl aus:

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

    Beispielausgabe:

    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

Das Datenformat konvertieren und die ungefähre Dateigröße festlegen

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um die Daten in ein anderes Format zu konvertieren:

    CREATE TABLE "historic_climate_parquet" WITH (
          external_location = 's3://awsexamplebucket/historic_climate_parquet/',
          format = 'PARQUET') AS
    SELECT * FROM historic_climate_gz
  2. Führe den folgenden ls-Befehl aus, um die Größe des Datensatzes zu überprüfen:

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

    Beispielausgabe:

    Total Objects: 30
    Total Size: 9.8 GiB
  3. Ermittle die Anzahl der Buckets, die du verwenden musst, um die Anzahl der gewünschten Dateien zu erreichen. Beispielsweise benötigst du für 500-MB-Dateien und einen Datensatz mit 9,8 GB 20 Dateien.

  4. Führe den folgenden Befehl aus, um den Datensatz in 500-MB-Dateien zu konvertieren:

    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. Um zu bestätigen, dass der Datensatz die gewünschte Anzahl von Dateien enthält, führe den folgenden ls-Befehl aus:

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

    Beispielausgabe:

    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

Hinweis: Bucket-Tabellen unterstützen nicht die INSERT INTO-Anweisung.

Ähnliche Informationen

Beispiele für CTAS-Abfragen

Überlegungen und Einschränkungen für CTAS-Abfragen

AWS OFFICIALAktualisiert vor einem Jahr