ClickHouse/docs/ja/chdb/guides/querying-parquet.md
2024-11-18 11:58:58 +09:00

172 lines
8.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Parquetファイルをクエリする方法
sidebar_label: Parquetファイルのクエリ
slug: /ja/chdb/guides/querying-parquet
description: chDBを使用してParquetファイルをクエリする方法を学びます。
keywords: [chdb, parquet]
---
世界中のデータの多くはAmazon S3バケットに存在しています。このガイドでは、chDBを使用してそのデータをクエリする方法を学びます。
## セットアップ
まず、仮想環境を作成しましょう:
```bash
python -m venv .venv
source .venv/bin/activate
```
次に、chDBをインストールします。バージョン2.0.2以上であることを確認してください:
```bash
pip install "chdb>=2.0.2"
```
次に、iPythonをインストールします:
```bash
pip install ipython
```
`ipython`を使用してこのガイドのコマンドを実行します。起動するには以下を実行します:
```bash
ipython
```
また、Pythonスクリプトやお好みのートブックでコードを使用することもできます。
## Parquetメタデータの探索
これから、[Amazonレビュー](/docs/ja/getting-started/example-datasets/amazon-reviews)データセットのParquetファイルを探索します。まず、`chDB`をインストールしましょう:
```python
import chdb
```
Parquetファイルをクエリする際に、[`ParquetMetadata`](/docs/ja/interfaces/formats#parquetmetadata-data-format-parquet-metadata)入力フォーマットを使用して、ファイルの内容ではなくParquetメタデータを返すことができます。このフォーマットを使用する際に返されるフィールドを`DESCRIBE`句を使って確認しましょう:
```python
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')
```
```text
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`は多くのプロパティを含むタプルの配列なので、今回はそれらを除外します。
```python
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')
```
```text
Row 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のカラムが含まれていることがわかります。行グループはデータを論理的に水平に分割したものです。各行グループには関連するメタデータがあり、クエリツールはそのメタデータを使用してファイルを効率的にクエリできます。
行グループの1つを見てみましょう:
```python
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')
```
```text
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 🚅 +🐧=💥 😀
```
## Parquetファイルのクエリ
次に、ファイルの内容をクエリします。上記のクエリを調整して、`ParquetMetadata`を削除し、すべてのレビューで最も人気のある`star_rating`を計算してみましょう:
```python
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')
```
```text
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 million
```
興味深いことに、5つ星レビューは他のすべての評価を合わせたものよりも多いことがわかります。Amazonの商品が好まれているように見えますが、もし気に入らない場合は評価を付けないことが多いようです。