Я пытаюсь поймать данные из объекта S3. Я использую функцию S3 Select, как показано ниже:
версия boto3: 1.7.59
import boto3
s3 = boto3.client('s3')
r = s3.select_object_content(
Bucket = "bucket",
Key = "file.json",
ExpressionType='SQL',
Expression = "select * from s3object S3Object AS s",
InputSerialization = {
'JSON': {
'Type': 'LINES'
}
},
OutputSerialization = { 'JSON': { 'RecordDelimiter': ',' } },
)
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: ")
print(statsDetails['BytesScanned'])
print("Stats details bytesProcessed: ")
print(statsDetails['BytesProcessed'])
После запуска моего кода я получаю сообщение об ошибке:
Traceback (most recent call last): File "C:/Users/a_urrego/PycharmProjects/DW_FlightHub/S3Select.py", line 48, in OutputSerialization = { 'JSON': { 'RecordDelimiter': ',' } }, File "C:\Users\a_urrego\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botocore\client.py", line 314, in _api_call return self._make_api_call(operation_name, kwargs) File "C:\Users\a_urrego\AppData\Local\Programs\Python\Python36-32\lib\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 AS:as at line 1, column 33.
Process finished with exit code 1
Похоже, что переданное вами выражение SQL недействительно:
"select * from s3object S3Object AS s"
общий синтаксис SQL будет
"SELECT <columns | *> FROM <table> <alias>"
но похоже, что вы дублировали имя таблицы или что-то там. Верхний регистр в операторах SQL необязателен, но мне это нравится.
Я не использовал эту функцию boto3, но, похоже, это проблема после 3 минут поиска в Google и чтения сообщения об ошибке.
[Редактировать]
Обновил мой шаблон выше после обнаружения опечатки. Также стоит отметить, что в этом варианте использования псевдоним таблицы не нужен, поскольку это очень простой оператор SELECT.
Expression = "select * from s3object"
- этого достаточно.