← retour aux snippets

aws s3 select: requêter un CSV directement dans S3

Exécuter une requête SQL sur un objet CSV/JSON/Parquet stocké dans S3 sans le télécharger.

bash cloud #aws#s3#select

objectif

Extraire un sous-ensemble de données d’un fichier volumineux directement côté S3.

code minimal

BUCKET=bucket-data-pm
KEY=datasets/sales.csv.gz

aws s3api select-object-content \
  --bucket "$BUCKET" --key "$KEY" \
  --expression-type SQL \  --expression "SELECT s.* FROM S3Object s LIMIT 5" \  --input-serialization '{"CSV":{"FileHeaderInfo":"USE"},"CompressionType":"GZIP"}' \  --output-serialization '{"CSV":{}}' \  "$TMPDIR/out.json" | jq -r '.Payload[]?.Records?.Payload' | base64 -d

utilisation

# filtrer sur une colonne numérique
aws s3api select-object-content \  --bucket "$BUCKET" --key "$KEY" \  --expression-type SQL \  --expression "SELECT s.id, s.amount FROM S3Object s WHERE cast(s.amount as double) > 1000" \  --input-serialization '{"CSV":{"FileHeaderInfo":"USE"},"CompressionType":"GZIP"}' \  --output-serialization '{"CSV":{}}' \  "$TMPDIR/out.json" | jq -r '.Payload[]?.Records?.Payload' | base64 -d

variante(s) utile(s)

# JSON ligne à ligne
aws s3api select-object-content \  --bucket "$BUCKET" --key logs.json.gz \  --expression-type SQL \  --expression "SELECT * FROM S3Object[*] s WHERE s.level = 'error'" \  --input-serialization '{"JSON":{"Type":"LINES"},"CompressionType":"GZIP"}' \  --output-serialization '{"JSON":{}}' \  "$TMPDIR/out.json" | jq -r '.Payload[]?.Records?.Payload' | base64 -d

notes

  • la réponse est un flux d’événements; récupérez les chunks via jq ... | base64 -d.
  • attention aux coûts S3 Select; testez d’abord sur un petit échantillon.