Подсчет повторяющейся переменной в корзине AWS-S3 с помощью запроса S3-Select
Я запускаю скрипт Python для запроса корзины AWS-S3 с помощью инструмента AWS-S3-Select. Я импортирую переменную из текстового файла и хочу передать ее в запрос S3-Select. Я также хочу подсчитать все повторения импортированных переменных (в пределах указанного столбца), запрашивая весь каталог S3 вместо одного файла.
Это то, что я до сих пор:
import boto3
from boto3.session import Session
with open('txtfile.txt', 'r') as myfile:
variable = myfile.read()
ACCESS_KEY='accessKey'
SECRET_KEY='secredtKey'
session = Session(aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
s3b = session.client('s3')
r = s3b.select_object_content(
Bucket='s3BucketName',
Key='directory/fileName',
ExpressionType='SQL',
Expression="'select count(*)from S3Object s where s.columnName = %s;', [variable]",
InputSerialization={'CSV': {"FileHeaderInfo": "Use"}},
OutputSerialization={'CSV': {}},
)
for event in r['Payload']:
if 'Records' in event:
records = event['Records']['Payload'].decode('utf-8')
print(records)
elif 'Stats' in event:
statsDetails = event['Stats']['Details']
print("Stats details bytesScanned: ")
Когда я запускаю этот скрипт, я получаю следующую ошибку:
Traceback (most recent call last):
File "s3_query.py", line 20, in <module>
OutputSerialization={'CSV': {}},
File "/root/anaconda3/lib/python3.6/site-packages/botocore/client.py", line 314, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/root/anaconda3/lib/python3.6/site-packages/botocore/client.py", line 612, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (ParseUnexpectedToken) when calling the SelectObjectContent operation: Unexpected token found COMMA:',' at line 1, column 67.
1 ответ
Эта строка выглядит довольно странно:
Expression="'select count(*)from S3Object s where s.columnName = %s;', [variable]"
Это не обычный синтаксис SQL или Python.
Вы, вероятно, должны использовать:
Expression='select count(*)from S3Object s where s.columnName = %s;' % [variable]