re:invent 2017で発表されたS3 Selectのpreview が通ったので、試してみました。
※S3 Selectはプレビュなので、将来仕様が変わる場合があります。
試したのは、Python SDK 2.7になります。
必要なモジュールは、boto3と、下記からダウンロード、カレントフォルダに展開する必要があります。
wget http://s3select.s3-website-us-east-1.amazonaws.com/public/python/aws-python-sdk-s3-select-preview-1.0.0.zip
サポートされているリージョンは、下記となっており、東京リージョンのS3 bucketは対応していません。
米国東部 (バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン)、欧州 (アイルランド)、およびアジアパシフィック (シンガポール)
S3 Selectをサポートしていないリージョンを指定すると、下記エラーメッセージが表示されます。
botocore.exceptions.ClientError: An error occurred (MethodNotAllowed) when calling the SelectObjectContent operation: The specified method is not allowed against this resource.
サンプルコード
import boto3 from s3select import ResponseHandler import os import sys class PrintingResponseHandler(ResponseHandler): def handle_records(self, record_data): print(record_data.decode('utf-8')) args = sys.argv; CURRENT_DIR = os.path.abspath(os.path.dirname(__file__)) MODELS_DIR = os.path.join(CURRENT_DIR, 'models') os.environ['AWS_DATA_PATH'] = MODELS_DIR expression = args[1] s3 = boto3.client('s3','us-west-2') response = s3.select_object_content( Bucket='xxxxxx', Key='401307influenza.csv', SelectRequest={ 'ExpressionType': 'SQL', 'Expression': expression , 'InputSerialization': { 'CompressionType': 'NONE', 'CSV': { 'FileHeaderInfo': 'IGNORE', 'RecordDelimiter': '\n', 'FieldDelimiter': ',', } }, 'OutputSerialization': { 'CSV': { 'RecordDelimiter': '\n', 'FieldDelimiter': ',', } } } ) handler = PrintingResponseHandler() handler.handle_response(response['Body'])
所感
- S3でGZIPされたファイルに対しても、実行することが可能
- CSVの場合、Ⅰ行目を抜いて、COUNTしてくれました
- AVG、SUM、MAX、MINなども使えるとなっているが、現状使い方が悪いのかシンタックスエラーになってしまいます。(GROUP BYは未対応)
- select s._4 from S3Object where _4 = ‘2017’ のようにselect句とwhere句に同じフィールドで実行するとエラーとなる
botocore.exceptions.ClientError: An error occurred (InternalError) when calling the SelectObjectContent operation (reached max retries: 4): We encountered an internal error. Please try again.
日本語も表示することは可能(UTF-8に限られます)
現状暗号化されたS3 Objectには対応していない。
暗号化させて、S3 にアップロードして、
aws s3api put-object --bucket xxxxx --key 401307influenza2.csv --body 401307influenza2.csv --server-side-encryption AES256 --debug
S3 Selectしたところ、以下エラーが返ります。
botocore.exceptions.ClientError: An error occurred (UnsupportedEncryptionMode) when calling the SelectObjectContent operation: We do not support server side encryption. Please check the service documentation and try again.
あと、検索はフルスキャンになるか情報がなかったので、不明