Осмысление больших данных

Как я повысил производительность при получении больших данных с помощью S3-Select

Как эффективно извлекать данные с помощью S3-select и чем он отличается от Amazon Athena

Недавно я наткнулся на функцию S3, которая особенно полезна при работе с большими данными. Вы можете написать простой запрос SQL, чтобы выбрать определенные столбцы и отфильтровать определенные строки, чтобы получить только те данные, которые вам нужны для вашего приложения. В этой статье я продемонстрирую, как этого добиться с помощью библиотеки Python boto3.

Пример использования

Представьте себе следующий сценарий:

  • Вы регулярно получаете один большой CSV-файл, который хранится в корзине S3. Этот файл содержит маркетинговые данные о всех странах, в которых работает ваш интернет-магазин.
  • Однако у вас есть приложение, работающее внутри AWS Lambda, которому нужны маркетинговые данные только из одной конкретной страны.

Обычно вам придется загрузить весь этот большой файл и отфильтровать данные внутри вашего приложения. Проблема в том, что вашей лямбда-функции может не хватить ОЗУ для чтения всего этого большого файла в память. Есть несколько способов решить эту проблему, например, чтение и фильтрация данных по частям или перемещение функции в контейнер Docker, но самым простым и наиболее экономичным решением в этом сценарии было бы использование S3-Select. Вот как это работает.

Реализация

Во-первых, поскольку у меня на самом деле нет никаких маркетинговых данных, мы будем использовать данные о поездках на такси из Нью-Йорка [1] и отфильтровать подозрительные записи с помощью неизвестного типа оплаты, закодированного как payment_type==5 согласно словарь данных.

Давайте посмотрим, сколько строк во всем файле по сравнению со строками только с payment_type==5.

Это означает, что нас интересуют только 12 из полумиллиона записей. Было бы огромной тратой ресурсов загружать и считывать весь набор данных в память только для того, чтобы получить эти 12 строк!

S3-Выбрать

Чтобы продемонстрировать S3-Select в действии, мы сначала загружаем наш большой CSV-файл [1] в корзину S3:

Теперь мы можем использовать S3-Select для получения только данных с типом платежа, равным 5, т.е. мы извлекаем из S3 только те данные, которые нас интересуют - данные с неизвестным типом платежа. И что самое приятное, все это определяется простым SQL-запросом:

  • в нашем запросе мы выбираем только столбцы, которые нам нужны для нашего варианта использования
  • мы фильтруем только payment_type='5' - обратите внимание, что в S3 все столбцы в плоском файле считаются текстовыми, поэтому обязательно заключите свое значение в кавычки '5'.

В приведенном выше фрагменте кода нам нужно было определить InputSerialization='CSV', чтобы указать, что это формат нашего объекта S3. Кроме того, мы устанавливаем FileHeaderInfo в 'Use', что гарантирует, что мы можем использовать имена столбцов в нашем запросе S3-select.

Используя параметр OutputSerialization, мы определяем, что хотим, чтобы наш вывод был разделен запятыми, что позволяет нам сохранять результат в отдельном файле CSV. Если вы хотите использовать S3-Select в API, вы можете предпочесть формат JSON.

Некоторые дополнительные предостережения:

  • S3-select возвращает только записи, а не имена столбцов (header), поэтому в строке 27 я убедился, что те же столбцы, которые я определил в query, также включены в качестве первой строки в нашем TARGET_FILE.
  • S3 select возвращает поток закодированных байтов [2], поэтому нам нужно перебрать возвращенный поток и декодировать вывод: .decode('utf-8').

Проверка результатов

Давайте перепроверим TARGET_FILE - в нем должно быть только 12 строк.

Результат:

Nr of rows: 12
    ID  distance  tip  total
0    1       9.7    0  31.80
1    1      10.0    0  30.80
2    1       0.4    0   7.80
3    1      13.6    0  40.80
4    1       0.5    0   7.80
5    1       1.7    0  11.80
6    1       6.4    0  22.80
7    1       4.0    0  16.80
8    1       1.7    0  11.30
9    1       5.6    0  22.80
10   1       7.3    0  30.42
11   1       6.7    0  24.80

S3-select против Афины

Вы можете спросить: если S3 настолько прост в использовании, зачем нам Athena, чтобы запрашивать озеро данных? Вот основные различия между этими двумя:

  • Athena может запросить сразу несколько объектов, а с S3 select мы можем запросить только один объект (например, один плоский файл).
  • С помощью Athena мы можем инкапсулировать сложную бизнес-логику с помощью ANSI-совместимых SQL-запросов, в то время как S3-select позволяет выполнять только базовые запросы для фильтрации данных перед их загрузкой из S3.
  • Athena поддерживает больше форматов файлов и больше форм сжатия файлов, чем S3-Select. Например, S3-select поддерживает только CSV, JSON и Parquet, а Athena дополнительно поддерживает файлы TSV, ORC и т. Д.
  • S3-select работает только с S3 API (например, с использованием Python boto3 SDK), в то время как Athena можно запрашивать непосредственно из консоли управления или клиентов SQL через JDBC.
  • Athena позволяет использовать множество методов оптимизации для повышения производительности и оптимизации затрат, таких как разбиение на разделы, хранение по столбцам, в то время как S3-select - это очень элементарный запрос, который всего лишь фильтрует данные.
  • S3-select можно запросить напрямую, тогда как Athena требует определения схемы.

Преимущества S3-Select

Короче говоря, преимущества этого API:

  • уменьшить ввод-вывод - тем самым повысить производительность
  • снизить затраты за счет меньших комиссий за передачу данных.

Заключение

В этой статье мы обсудили S3-select, который позволяет фильтровать данные, хранящиеся в S3. S3-select следует использовать только при работе с одним файлом и когда вам нужно только выбрать определенные столбцы и отфильтровать только определенные строки из плоского файла.

Если эта статья была полезной, подписывайтесь на меня, чтобы увидеть мои следующие статьи.

В приведенной ниже статье я обсуждаю различные варианты передачи больших объемов данных между корзинами S3.



Ресурсы:

[1] Данные записи поездки TLC: https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page

[2] Документы Boto3: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.select_object_content

[3] Документы AWS: https://docs.aws.amazon.com/AmazonS3/latest/API/API_InputSerialization.html и https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent .html