- 开发指南
- 查询 Parquet 文件
如何查询 Parquet 文件
全球有大量数据存储在 Amazon S3 存储桶中。 在本指南中,我们将学习如何使用 chDB 查询这些数据。
设置
首先,创建一个虚拟环境:
python -m venv .venv
source .venv/bin/activate
接下来我们将安装 chDB。 请确保已安装的版本为 2.0.2 或更高:
pip install "chdb>=2.0.2"
接下来我们来安装 IPython:
pip install ipython
在本指南接下来的内容中,我们将使用 ipython 来运行命令。你可以通过执行以下命令来启动它:
ipython
你也可以在 Python 脚本或常用的 Notebook 中使用这段代码。
探索 Parquet 元数据
我们将探索一个来自 Amazon Reviews 数据集的 Parquet 文件。
但在此之前,先安装 chDB:
import 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 文件包含超过 4,000 万行数据,被划分为 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 评论日期 493 646 16455 16472
1 市场 66 64 US US
2 客户ID 5207967 7997207 10049 53096413
3 评论ID 14748425 17991290 R10004U8OQDOGE RZZZUTBAV1RYI
4 产品ID 8003456 13969668 0000032050 BT00DDVMVQ
5 父产品ID 5758251 7974737 645 999999730
6 产品标题 41068525 63355320 ! Small S 1pc Black 1pc Navy (Blue) Replacemen... 🌴 Vacation On The Beach
7 产品类别 1726 1815 服装 宠物用品
8 星级评分 369036 374046 1 5
9 有用票数 538940 1022990 0 3440
10 总票数 610902 1080520 0 3619
11 vine 11426 125999 0 1
12 已验证购买 102634 125999 0 1
13 评论标题 16538189 27634740 🤹🏽♂️🎤Great product. Practice makes perfect. D...
14 评论正文 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')
星级评分 数量 formatReadableQuantity(count())
0 1 3253070 325万
1 2 1865322 187万
2 3 3130345 313万
3 4 6578230 658万
4 5 27078664 2708万
有意思的是,5 星评价的数量比其他所有评分加起来还多! 看起来大家要么很喜欢亚马逊上的商品,要么如果不喜欢,就干脆不评分。