Utilizzo CTAS e INSERT INTO scopo ETL e analisi dei dati - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo CTAS e INSERT INTO scopo ETL e analisi dei dati

Puoi utilizzare Create Table as Select (CTAS) e INSERTINTOle istruzioni in Athena per estrarre, trasformare e caricare (ETL) dati in Amazon S3 per l'elaborazione dei dati. In questo argomento viene illustrato come utilizzare queste istruzioni per partizionare e convertire un set di dati nel formato di dati in colonna per ottimizzarlo per l'analisi dei dati.

CTASle istruzioni utilizzano SELECTquery standard per creare nuove tabelle. È possibile utilizzare un'CTASistruzione per creare un sottoinsieme dei dati per l'analisi. In un'unica CTAS istruzione, puoi partizionare i dati, specificare la compressione e convertirli in un formato colonnare come Apache Parquet o Apache. ORC Quando si esegue la CTAS query, le tabelle e le partizioni create vengono automaticamente aggiunte a. AWS Glue Data Catalog In questo modo le nuove tabelle e partizioni create sono immediatamente disponibili per le query successive.

INSERTINTOle istruzioni inseriscono nuove righe in una tabella di destinazione in base a un'istruzione di SELECT query eseguita su una tabella di origine. È possibile utilizzare INSERT INTO le istruzioni per trasformare e caricare i dati della tabella di origine in CSV formato della tabella di destinazione utilizzando tutte le trasformazioni CTAS supportate.

Panoramica

In Athena, utilizzate un'CTASistruzione per eseguire una conversione batch iniziale dei dati. Utilizza quindi più INSERT INTO istruzioni per apportare aggiornamenti incrementali alla tabella creata dall'CTASistruzione.

Fase 1: creare una tabella basata sul set di dati originale

L'esempio in questo argomento utilizza un sottoinsieme leggibile da Amazon S3 del set di dati giornalieri (-d) della rete NOAA globale di climatologia storica globale disponibile pubblicamente. GHCN I dati in Amazon S3 hanno le seguenti caratteristiche.

Location: s3://aws-bigdata-blog/artifacts/athena-ctas-insert-into-blog/ Total objects: 41727 Size of CSV dataset: 11.3 GB Region: us-east-1

I dati originali vengono archiviati in Amazon S3 senza partizioni. I dati sono in CSV formato in file come i seguenti.

2019-10-31 13:06:57 413.1 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0000 2019-10-31 13:06:57 412.0 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0001 2019-10-31 13:06:57 34.4 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0002 2019-10-31 13:06:57 412.2 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0100 2019-10-31 13:06:57 412.7 KiB artifacts/athena-ctas-insert-into-blog/2010.csv0101

Le dimensioni dei file in questo esempio sono relativamente piccole. Unendoli in file più grandi, è possibile ridurre il numero totale di file, consentendo prestazioni migliori delle query. È possibile utilizzare INSERT INTO le istruzioni CTAS and per migliorare le prestazioni delle query.

Per creare un database e una tabella in base al set di dati di esempio
  1. Nella console Athena, scegli la Regione AWSStati Uniti orientali (Virginia settentrionale). Assicurarsi di eseguire tutte le query in questo tutorial in us-east-1.

  2. Nell'editor di query Athena, esegui il CREATEDATABASEcomando per creare un database.

    CREATE DATABASE blogdb
  3. Eseguire l'istruzione seguente per creare una tabella.

    CREATE EXTERNAL TABLE `blogdb`.`original_csv` ( `id` string, `date` string, `element` string, `datavalue` bigint, `mflag` string, `qflag` string, `sflag` string, `obstime` bigint) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://aws-bigdata-blog/artifacts/athena-ctas-insert-into-blog/'

Passaggio 2: Utilizzare CTAS per partizionare, convertire e comprimere i dati

Dopo aver creato una tabella, puoi utilizzare una singola CTASistruzione per convertire i dati in formato Parquet con compressione Snappy e partizionare i dati per anno.

La tabella creata nella fase 1 ha un campo date con la data nel formato YYYYMMDD (ad esempio, 20100104). Poiché la nuova tabella verrà partizionata per year, l'istruzione di esempio nella procedura seguente utilizza la funzione Presto substr("date",1,4) per estrarre il valore year dal campo date.

Per convertire i dati in formato Parquet con compressione Snappy e partizionamento per anno
  • Esegui la seguente istruzione, sostituendo CTAS your-bucket con la posizione del tuo bucket Amazon S3.

    CREATE table new_parquet WITH (format='PARQUET', parquet_compression='SNAPPY', partitioned_by=array['year'], external_location = 's3://amzn-s3-demo-bucket/optimized-data/') AS SELECT id, date, element, datavalue, mflag, qflag, sflag, obstime, substr("date",1,4) AS year FROM original_csv WHERE cast(substr("date",1,4) AS bigint) >= 2015 AND cast(substr("date",1,4) AS bigint) <= 2019
    Nota

    In questo esempio, la tabella creata include solo i dati dal 2015 al 2019. Nel passaggio 3, aggiungi nuovi dati a questa tabella utilizzando il INSERT INTO comando.

Al termine della query, utilizza la seguente procedura per verificare l'output nella posizione Amazon S3 specificata nell'CTASistruzione.

Per visualizzare le partizioni e i file di parquet creati dall'istruzione CTAS
  1. Per mostrare le partizioni create, esegui il seguente AWS CLI comando. Assicurarsi di includere la barra finale (/).

    aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/

    L'output mostra le partizioni.

    PRE year=2015/ PRE year=2016/ PRE year=2017/ PRE year=2018/ PRE year=2019/
  2. Per visualizzare i file Parquet, eseguire il comando seguente. L'opzione | head -5 che limita l'output ai primi cinque risultati, non è disponibile in Windows.

    aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/ --recursive --human-readable | head -5

    L'output è simile a quello riportato di seguito.

    2019-10-31 14:51:05 7.3 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_1be48df2-3154-438b-b61d-8fb23809679d 2019-10-31 14:51:05 7.0 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_2a57f4e2-ffa0-4be3-9c3f-28b16d86ed5a 2019-10-31 14:51:05 9.9 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_34381db1-00ca-4092-bd65-ab04e06dc799 2019-10-31 14:51:05 7.5 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_354a2bc1-345f-4996-9073-096cb863308d 2019-10-31 14:51:05 6.9 MiB optimized-data/year=2015/20191031_215021_00001_3f42d_42da4cfd-6e21-40a1-8152-0b902da385a1

Passaggio 3: Utilizzare INSERT INTO per aggiungere dati

Nel passaggio 2, è stata CTAS creata una tabella con partizioni per gli anni dal 2015 al 2019. Tuttavia, il set di dati originale contiene anche dati relativi agli anni dal 2010 al 2014. Ora aggiungi quei dati usando un'INSERTINTOistruzione.

Per aggiungere dati alla tabella utilizzando una o più INSERT INTO istruzioni
  1. Esegui il INSERT INTO comando seguente, specificando gli anni precedenti al 2015 nella WHERE clausola.

    INSERT INTO new_parquet SELECT id, date, element, datavalue, mflag, qflag, sflag, obstime, substr("date",1,4) AS year FROM original_csv WHERE cast(substr("date",1,4) AS bigint) < 2015
  2. Eseguire nuovamente il comando aws s3 ls, utilizzando la seguente sintassi.

    aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/

    L'output mostra le nuove partizioni.

    PRE year=2010/ PRE year=2011/ PRE year=2012/ PRE year=2013/ PRE year=2014/ PRE year=2015/ PRE year=2016/ PRE year=2017/ PRE year=2018/ PRE year=2019/
  3. Per vedere la riduzione delle dimensioni del set di dati ottenuta utilizzando la compressione e lo storage a colonne in formato Parquet, eseguire il comando seguente.

    aws s3 ls s3://amzn-s3-demo-bucket/optimized-data/ --recursive --human-readable --summarize

    I seguenti risultati mostrano che la dimensione del set di dati dopo Parquet con compressione Snappy è 1,2 GB.

    ... 2020-01-22 18:12:02 2.8 MiB optimized-data/year=2019/20200122_181132_00003_nja5r_f0182e6c-38f4-4245-afa2-9f5bfa8d6d8f 2020-01-22 18:11:59 3.7 MiB optimized-data/year=2019/20200122_181132_00003_nja5r_fd9906b7-06cf-4055-a05b-f050e139946e Total Objects: 300 Total Size: 1.2 GiB
  4. Se vengono aggiunti altri CSV dati alla tabella originale, è possibile aggiungere tali dati alla tabella parquet utilizzando INSERT INTO le istruzioni. Ad esempio, se disponi di nuovi dati per l'anno 2020, puoi eseguire la seguente INSERT INTO dichiarazione. L'istruzione aggiunge i dati e la partizione pertinente alla tabella new_parquet.

    INSERT INTO new_parquet SELECT id, date, element, datavalue, mflag, qflag, sflag, obstime, substr("date",1,4) AS year FROM original_csv WHERE cast(substr("date",1,4) AS bigint) = 2020
    Nota

    L'INSERTINTOistruzione supporta la scrittura di un massimo di 100 partizioni nella tabella di destinazione. Tuttavia, per aggiungere più di 100 partizioni, è possibile eseguire più INSERT INTO istruzioni. Per ulteriori informazioni, consulta Utilizzare CTAS e INSERT INTO aggirare il limite di 100 partizioni.

Fase 4: misurare le prestazioni e le differenze dei costi

Dopo aver trasformato i dati, puoi misurare i miglioramenti delle prestazioni e i risparmi sui costi eseguendo le stesse query nelle tabelle nuove e precedenti e confrontando i risultati.

Nota

Per informazioni sui costi per query di Athena, consulta Prezzi di Amazon Athena.

Per misurare i miglioramenti delle performance e le differenze dei costi
  1. Eseguire la seguente query nella tabella originale. La query trova il numero di distinti IDs per ogni valore dell'anno.

    SELECT substr("date",1,4) as year, COUNT(DISTINCT id) FROM original_csv GROUP BY 1 ORDER BY 1 DESC
  2. Annotare il tempo di esecuzione della query e la quantità di dati analizzati.

  3. Eseguire la stessa query nella nuova tabella, annotando il tempo di esecuzione della query e la quantità di dati analizzati.

    SELECT year, COUNT(DISTINCT id) FROM new_parquet GROUP BY 1 ORDER BY 1 DESC
  4. Confrontare i risultati e calcolare la differenza delle prestazioni e dei costi. I risultati di esempio riportati di seguito mostrano che la query di test nella nuova tabella è stata più veloce e più economica rispetto alla query nella vecchia tabella.

    Tabella Runtime Dati scansionati
    Originale 16,88 secondi 11,35 GB
    Novità 3,79 secondi 428,05 MB
  5. Eseguire la seguente query di esempio nella tabella originale. La query calcola la temperatura massima media (Celsius), la temperatura minima media (Celsius) e la piovosità media (mm) per la Terra nel 2018.

    SELECT element, round(avg(CAST(datavalue AS real)/10),2) AS value FROM original_csv WHERE element IN ('TMIN', 'TMAX', 'PRCP') AND substr("date",1,4) = '2018' GROUP BY 1
  6. Annotare il tempo di esecuzione della query e la quantità di dati analizzati.

  7. Eseguire la stessa query nella nuova tabella, annotando il tempo di esecuzione della query e la quantità di dati analizzati.

    SELECT element, round(avg(CAST(datavalue AS real)/10),2) AS value FROM new_parquet WHERE element IN ('TMIN', 'TMAX', 'PRCP') and year = '2018' GROUP BY 1
  8. Confrontare i risultati e calcolare la differenza delle prestazioni e dei costi. I risultati di esempio riportati di seguito mostrano che la query di test nella nuova tabella è stata più veloce e più economica rispetto alla query nella vecchia tabella.

    Tabella Runtime Dati scansionati
    Originale 18,65 secondi 11,35 GB
    Novità 1,92 secondi 68 MB

Riepilogo

In questo argomento è stato illustrato come eseguire ETL operazioni utilizzando le INSERT INTO istruzioni CTAS e in Athena. Hai eseguito il primo set di trasformazioni utilizzando un'CTASistruzione che convertiva i dati nel formato Parquet con compressione Snappy. L'CTASistruzione ha inoltre convertito il set di dati da non partizionato a partizionato. Ciò ha ridotto le sue dimensioni e i costi di esecuzione delle query. Quando diventano disponibili nuovi dati, è possibile utilizzare un'INSERTINTOistruzione per trasformare e caricare i dati nella tabella creata con l'istruzione. CTAS