Как выполнять запросы к файлам Parquet
Значительная часть мировых данных хранится в бакетах Amazon S3.
В этом руководстве вы узнаете, как выполнять запросы к этим данным с помощью chDB.
Настройка
Сначала создадим виртуальное окружение:
python -m venv .venv
source .venv/bin/activate
Теперь установим chDB.
Убедитесь, что у вас установлена версия 2.0.2 или выше:
pip install "chdb>=2.0.2"
Теперь установим IPython:
Мы будем использовать ipython для выполнения команд в оставшейся части этого руководства. Запустить его можно следующей командой:
Вы также можете использовать этот код в скрипте на Python или в вашем любимом ноутбуке (например, Jupyter Notebook).
Мы будем исследовать файл Parquet из набора данных Amazon reviews.
Но сначала давайте установим chDB:
При выполнении запросов к файлам Parquet мы можем использовать формат ввода ParquetMetadata, чтобы получать метаданные Parquet вместо содержимого файла.
Давайте используем предложение DESCRIBE, чтобы посмотреть, какие поля возвращаются при использовании этого формата:
query = """
DESCRIBE s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet',
ParquetMetadata
)
SETTINGS describe_compact_output=1
"""
chdb.query(query, 'TabSeparated')
num_columns UInt64
num_rows UInt64
num_row_groups UInt64
format_version String
metadata_size UInt64
total_uncompressed_size UInt64
total_compressed_size UInt64
columns Array(Tuple(name String, path String, max_definition_level UInt64, max_repetition_level UInt64, physical_type String, logical_type String, compression String, total_uncompressed_size UInt64, total_compressed_size UInt64, space_saved String, encodings Array(String)))
row_groups Array(Tuple(num_columns UInt64, num_rows UInt64, total_uncompressed_size UInt64, total_compressed_size UInt64, columns Array(Tuple(name String, path String, total_compressed_size UInt64, total_uncompressed_size UInt64, have_statistics Bool, statistics Tuple(num_values Nullable(UInt64), null_count Nullable(UInt64), distinct_count Nullable(UInt64), min Nullable(String), max Nullable(String))))))
Теперь давайте посмотрим на метаданные этого файла.
И columns, и row_groups содержат массивы кортежей с множеством свойств, поэтому пока мы их опустим.
query = """
SELECT * EXCEPT(columns, row_groups)
FROM s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet',
ParquetMetadata
)
"""
chdb.query(query, 'Vertical')
Строка 1:
──────
num_columns: 15
num_rows: 41905631
num_row_groups: 42
format_version: 2.6
metadata_size: 79730
total_uncompressed_size: 14615827169
total_compressed_size: 9272262304
Из этого вывода мы узнаём, что этот файл Parquet содержит более 40 миллионов строк, разделённых на 42 группы строк, с 15 столбцами данных в каждой строке.
Группа строк — это логическое горизонтальное разбиение данных на строки.
У каждой группы строк есть связанные с ней метаданные, и инструменты для выполнения запросов могут использовать эти метаданные для эффективного выполнения запросов к файлу.
Давайте рассмотрим одну из групп строк:
query = """
WITH rowGroups AS (
SELECT rg
FROM s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet',
ParquetMetadata
)
ARRAY JOIN row_groups AS rg
LIMIT 1
)
SELECT tupleElement(c, 'name') AS name, tupleElement(c, 'total_compressed_size') AS total_compressed_size,
tupleElement(c, 'total_uncompressed_size') AS total_uncompressed_size,
tupleElement(tupleElement(c, 'statistics'), 'min') AS min,
tupleElement(tupleElement(c, 'statistics'), 'max') AS max
FROM rowGroups
ARRAY JOIN tupleElement(rg, 'columns') AS c
"""
chdb.query(query, 'DataFrame')
name total_compressed_size total_uncompressed_size min max
0 review_date 493 646 16455 16472
1 marketplace 66 64 US US
2 customer_id 5207967 7997207 10049 53096413
3 review_id 14748425 17991290 R10004U8OQDOGE RZZZUTBAV1RYI
4 product_id 8003456 13969668 0000032050 BT00DDVMVQ
5 product_parent 5758251 7974737 645 999999730
6 product_title 41068525 63355320 ! Размер S, 1 шт. чёрного цвета, 1 шт. тёмно-синего (синего) сменный... 🌴 Отпуск на пляже
7 product_category 1726 1815 Одежда Товары для домашних питомцев
8 star_rating 369036 374046 1 5
9 helpful_votes 538940 1022990 0 3440
10 total_votes 610902 1080520 0 3619
11 vine 11426 125999 0 1
12 verified_purchase 102634 125999 0 1
13 review_headline 16538189 27634740 🤹🏽♂️🎤Отличный продукт. Практика ведёт к совершенству. D...
14 review_body 145886383 232457911 🚅 +🐧=💥 😀
Запросы к файлам Parquet
Теперь давайте выполним запрос к содержимому файла.
Мы можем сделать это, изменив приведённый выше запрос, убрав из него ParquetMetadata и затем, например, вычислив самое популярное значение star_rating по всем отзывам:
query = """
SELECT star_rating, count() AS count, formatReadableQuantity(count)
FROM s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet'
)
GROUP BY ALL
ORDER BY star_rating
"""
chdb.query(query, 'DataFrame')
star_rating count formatReadableQuantity(count())
0 1 3253070 3.25 миллион
1 2 1865322 1.87 миллион
2 3 3130345 3.13 миллион
3 4 6578230 6.58 миллион
4 5 27078664 27.08 миллион
Интересно, что отзывов на 5 звёзд больше, чем всех остальных оценок вместе взятых!
Похоже, людям нравятся товары на Amazon, а если нет — они просто не ставят оценку.