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

8.8 KiB
Raw Blame History

title sidebar_label slug description keywords
S3バケット内のデータをクエリする方法 S3でのクエリ /ja/chdb/guides/querying-s3 chDBを使用してS3バケット内のデータをクエリする方法を学びます。
chdb
s3

世界中の多くのデータは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スクリプトやお好みのートブックでもコードを使用できます。

S3バケット内のファイルを一覧表示

まずはじめに、Amazonレビューを含むS3バケット内のすべてのファイルを一覧表示しましょう。 これを行うために、s3テーブル関数を使用し、ファイルへのパスまたは一連のファイルへのワイルドカードを渡します。

:::tip バケット名のみを渡すと例外が発生します。 :::

また、ファイルが解析されず、ファイルごとに一行のみが返され、_fileバーチャルカラムと_pathバーチャルカラム経由でファイルとパスにアクセスできるようにするために、One入力フォーマットを使用します。

import chdb

chdb.query("""
SELECT
    _file,
    _path
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', One)
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')
┌─_file───────────────────────────────┬─_path─────────────────────────────────────────────────────────────────────┐
│ amazon_reviews_2010.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2010.snappy.parquet  │
│ amazon_reviews_1990s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_1990s.snappy.parquet │
│ amazon_reviews_2013.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2013.snappy.parquet  │
│ amazon_reviews_2015.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet  │
│ amazon_reviews_2014.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2014.snappy.parquet  │
│ amazon_reviews_2012.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2012.snappy.parquet  │
│ amazon_reviews_2000s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2000s.snappy.parquet │
│ amazon_reviews_2011.snappy.parquet  │ datasets-documentation/amazon_reviews/amazon_reviews_2011.snappy.parquet  │
└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┘

このバケットにはParquetファイルのみが含まれています。

S3バケット内のファイルのクエリ

次に、これらのファイルにクエリを実行する方法を学びましょう。 各ファイルの行数をカウントしたい場合は、次のクエリを実行できます:

chdb.query("""
SELECT
    _file,
    count() AS count,
    formatReadableQuantity(count) AS readableCount    
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')
┌─_file───────────────────────────────┬────count─┬─readableCount───┐
│ amazon_reviews_2013.snappy.parquet  │ 28034255 │ 28.03 million   │
│ amazon_reviews_1990s.snappy.parquet │   639532 │ 639.53 thousand │
│ amazon_reviews_2011.snappy.parquet  │  6112495 │ 6.11 million    │
│ amazon_reviews_2015.snappy.parquet  │ 41905631 │ 41.91 million   │
│ amazon_reviews_2012.snappy.parquet  │ 11541011 │ 11.54 million   │
│ amazon_reviews_2000s.snappy.parquet │ 14728295 │ 14.73 million   │
│ amazon_reviews_2014.snappy.parquet  │ 44127569 │ 44.13 million   │
│ amazon_reviews_2010.snappy.parquet  │  3868472 │ 3.87 million    │
└─────────────────────────────────────┴──────────┴─────────────────┘

また、S3バケットのHTTP URIを渡すことでも同じ結果を得ることができます

chdb.query("""
SELECT
    _file,
    count() AS count,
    formatReadableQuantity(count) AS readableCount    
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')

では、DESCRIBE句を使用してこれらのParquetファイルのスキーマを見てみましょう

chdb.query("""
DESCRIBE s3('s3://datasets-documentation/amazon_reviews/*.parquet')
SETTINGS describe_compact_output=1
""", 'PrettyCompact')
    ┌─name──────────────┬─type─────────────┐
 1. │ review_date       │ Nullable(UInt16) │
 2. │ marketplace       │ Nullable(String) │
 3. │ customer_id       │ Nullable(UInt64) │
 4. │ review_id         │ Nullable(String) │
 5. │ product_id        │ Nullable(String) │
 6. │ product_parent    │ Nullable(UInt64) │
 7. │ product_title     │ Nullable(String) │
 8. │ product_category  │ Nullable(String) │
 9. │ star_rating       │ Nullable(UInt8)  │
10. │ helpful_votes     │ Nullable(UInt32) │
11. │ total_votes       │ Nullable(UInt32) │
12. │ vine              │ Nullable(Bool)   │
13. │ verified_purchase │ Nullable(Bool)   │
14. │ review_headline   │ Nullable(String) │
15. │ review_body       │ Nullable(String) │
    └───────────────────┴──────────────────┘

次に、レビューの数に基づいてトップの製品カテゴリーを計算し、平均の星評価も計算してみましょう:

chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact')
    ┌─product_category─┬──reviews─┬──avg─┐
 1. │ Toys             │  4864056 │ 4.21 │
 2. │ Apparel          │  5906085 │ 4.11 │
 3. │ Luggage          │   348644 │ 4.22 │
 4. │ Kitchen          │  4880297 │ 4.21 │
 5. │ Books            │ 19530930 │ 4.34 │
 6. │ Outdoors         │  2302327 │ 4.24 │
 7. │ Video            │   380596 │ 4.19 │
 8. │ Grocery          │  2402365 │ 4.31 │
 9. │ Shoes            │  4366757 │ 4.24 │
10. │ Jewelry          │  1767667 │ 4.14 │
    └──────────────────┴──────────┴──────┘

プライベートなS3バケット内のファイルにクエリする

プライベートなS3バケット内のファイルにクエリを実行する場合には、アクセスキーとシークレットを渡す必要があります。これらの資格情報をs3テーブル関数に渡すことができます:

chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', 'access-key', 'secret')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact')

:::note このクエリはパブリックバケットなので動作しません! :::

別の方法として、名前付きコレクションを使用することもできますが、このアプローチはまだchDBでサポートされていません。