Grande parte dos dados do mundo está armazenada em buckets do Amazon S3. Neste guia, vamos aprender a consultar esses dados usando o chDB.
Configuração
Primeiro, vamos criar um ambiente virtual:
python -m venv .venv
source .venv/bin/activateE agora vamos instalar o chDB. Verifique se você tem a versão 2.0.2 ou superior:
pip install "chdb>=2.0.2"Agora, vamos instalar o IPython:
pip install ipythonVamos usar o ipython para executar os comandos do restante do guia, que você pode iniciar executando:
ipythonVocê também pode usar o código em um script em Python ou no notebook da sua preferência.
Explorando os metadados do Parquet
Vamos explorar um arquivo Parquet do conjunto de dados Amazon reviews.
Mas antes, vamos instalar o chDB:
import chdbAo consultar arquivos Parquet, podemos usar o formato de entrada ParquetMetadata para retornar metadados do Parquet em vez do conteúdo do arquivo.
Vamos usar a cláusula DESCRIBE para ver os campos retornados ao usar esse formato:
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))))))Agora, vamos dar uma olhada nos metadados deste arquivo.
columns e row_groups contêm arrays de tuplas com muitas propriedades, então vamos deixá-los de fora por enquanto.
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')Linha 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: 9272262304A partir dessa saída, vemos que este arquivo Parquet tem mais de 40 milhões de linhas, distribuídas em 42 grupos de linhas, com 15 colunas de dados por linha. Um grupo de linhas é uma partição horizontal lógica dos dados em linhas. Cada grupo de linhas tem metadados associados, e as ferramentas de consulta podem usar esses metadados para consultar o arquivo com eficiência.
Vamos examinar um dos grupos de linhas:
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 ! Small S 1pc Black 1pc Navy (Blue) Replacemen... 🌴 Vacation On The Beach
7 product_category 1726 1815 Apparel Pet Products
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 🤹🏽♂️🎤Great product. Practice makes perfect. D...
14 review_body 145886383 232457911 🚅 +🐧=💥 😀Consultando arquivos Parquet
Em seguida, vamos consultar o conteúdo do arquivo.
Podemos fazer isso ajustando a consulta acima para remover ParquetMetadata e, por exemplo, calcular a star_rating mais frequente em todas as avaliações:
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 million
1 2 1865322 1.87 million
2 3 3130345 3.13 million
3 4 6578230 6.58 million
4 5 27078664 27.08 millionCuriosamente, há mais avaliações de 5 estrelas do que todas as outras notas somadas! Parece que as pessoas gostam dos produtos da Amazon ou, se não gostam, simplesmente não deixam uma avaliação.