Агрегатные функции в S3 Select - PullRequest
0 голосов
/ 07 мая 2018

Amazon S3 Select позволяет пользователю писать SQL для объектов S3, но недостаточно документации о том, какие стандартные функции SQL поддерживаются.

Согласно документации , Amazon S3 Select поддерживает AVG, COUNT, MAX, MIN и SUM.Но когда я запускаю любой агрегированный запрос, я получаю сообщение об ошибке типа

botocore.exceptions.ClientError: Произошла ошибка (UnsupportedSqlOperation) при вызове операции SelectObjectContent: Неподдерживаемая операция SQL GROUP BY.Пожалуйста, проверьте сервисную документацию для поддерживаемых операций.

Вот код для воспроизведения:

import boto3
client = boto3.client('s3')

response = client.select_object_content(Bucket='my-bucket', Key='object.csv', 
    ExpressionType='SQL', Expression="select ID, count(*) from s3object group by s.ID ",
    InputSerialization = {'CSV':{"FileHeaderInfo": "Use"}, 'CompressionType': 'GZIP'},
    OutputSerialization = {'CSV':{}})

event_stream = response['Payload']
with open('output', 'wb') as f:
    for event in event_stream:
        if 'Records' in event:
            data = event['Records']['Payload']
            f.write(data)

1 Ответ

0 голосов
/ 08 мая 2018

Согласно комментарию Джона, агрегатные функции поддерживаются только без GROUP BY.

Вот несколько предостережений и указателей

  • Очевидно, вы можете отфильтровать набор, который хотите выполнитьВаша агрегация с использованием предложения WHERE или LIMIT.
  • Все является строкой, поэтому любая числовая операция требует CAST, например sum(cast(my_col as float))
  • Смешанные результаты с использованием MAX и MIN при интерпретации числовых столбцов как строк, т.е. без приведения;изначально он был успешным, но после дальнейшей обработки я не смог воспроизвести этот успех
  • Невозможно выполнить агрегатные функции в том же запросе, что и неагрегированные функции, и сообщение об ошибке является загадочным: A column name or a path provided in the query expression does not exist
...