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.
あと、検索はフルスキャンになるか情報がなかったので、不明