【AWS】S3 Select でCSVファイルの行数をカウント

CSVファイルの行数を数える単純な例。 S3 Select とは、見て分かる通り、S3上のCSVやJSONファイルに対してSQLライクなクエリを実行できる代物。

#!/usr/bin/env python3

import boto3

bucket_name = "baketsu"
obj_name = "hoge.txt"

s3 = boto3.client('s3', 'ap-northeast-1')
select_result = s3.select_object_content(
    Bucket=bucket_name,
    Key=obj_name,
    ExpressionType='SQL',
    Expression='SELECT count(*) AS cnt FROM S3Object s',
    InputSerialization={
        'CompressionType': 'NONE',
        'CSV': {
            'FileHeaderInfo': 'Ignore',
            'RecordDelimiter': '\n',
            'FieldDelimiter': ','
        }
    },
    OutputSerialization={
        'JSON': {
            'RecordDelimiter': '\n',
        }
    }
)

count_num = None
for event in select_result['Payload']:
    if 'Records' in event:
        request_count_obj = json.loads(
            event['Records']['Payload'].decode('utf-8'))
        count_num = request_count_obj["cnt"]

if count_num is None:
    raise RuntimeError("Something went wrong...")

「S3 Select」と聞くと、何か全く新しいサービスなのかと思ってしまいますが、 実際のところ、S3の片隅にひっそり追加されたような扱いですね (でも、すごく便利)。

参考