Осмысление больших данных
Как я повысил производительность при получении больших данных с помощью 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