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.